Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по потокам.   Найти похожие ветки 

 
dabreezy ©   (2006-03-23 11:50) [0]

Добрый день. Маленький вопрос по потокам. Я правильно понимаю что если у потока стоит freeonterminate:=true, то после того как метод Execute выполнится, то память 100% освободится и поток уничтожится?Т.е. не будет такого что он сам по себе может еще раз запустится?


 
Ega23 ©   (2006-03-23 11:52) [1]

Память освободится тогда, когда этому потоку будет сказано Tread.Terminate


 
Kolan ©   (2006-03-23 11:57) [2]

когда этому потоку будет сказано Tread.Terminate
будет вызван деструктор....

Не забывай что проверять флаг Terminated ты должен сам...


 
dabreezy ©   (2006-03-23 12:13) [3]

А если не будет вызвано Thread.Terminate? Просто поток сделает все свои действия и закончится, тогда память освободится?


 
Johnmen ©   (2006-03-23 13:05) [4]

Да.


 
begin...end ©   (2006-03-23 13:06) [5]

Если вызвать метод Terminate, то изменится значение свойства Terminated. И всё. Никакого освобождения памяти и вызова деструктора при этом не произойдёт. Метод Terminate -- это только способ указать потоку, что ему пора завершаться. А в методе Execute нужно периодически проверять состояние этого свойства, и, если Terminated = True, заканчивать работу.

После завершения той работы, которая выполнялась в Execute, нужно освободить ресурсы. Что это значит? Нужно, во-первых, уничтожить объект ядра "поток" (закрыть хэндл), а во-вторых, уничтожить экземпляр класса (потомка TThread), который является обёрткой над этим объектом ядра. И первым, и вторым занимается деструктор TThread.Destroy.

А FreeOnTerminate влияет на то, кто будет вызывать деструктор Destroy. Если FreeOnTerminate = True, то деструктор вызовет сам поток (после того, как закончится выполнение метода Execute и отработает обработчик OnTerminate). А если FreeOnTerminate = False, то после окончания работы потока деструктор должны будете вызвать Вы.


 
dabreezy ©   (2006-03-23 14:55) [6]


> begin...end ©   (23.03.06 13:06) [5]
> Если вызвать метод Terminate, то изменится

Спасибо большое.
Понял свою ошибку. У меня из обработчика OnTerminate запускались потоки еще раз. Видимо делать этого нельзя!


 
Kolan ©   (2006-03-23 14:57) [7]

У меня из обработчика OnTerminate запускались потоки еще раз.
Как то странно все это... Код бы привел...


 
dabreezy ©   (2006-03-23 15:25) [8]


> Kolan ©   (23.03.06 14:57) [7]
> У меня из обработчика OnTerminate

Код очень большой и Execute и onTerminate, там разобратся черт ногу сломишь. У меня тоже работало если запускать из OnTerminate, только вот если это сделать этак раз пять то потом начинает глючить и ужирать память :)


 
Сергей М. ©   (2006-03-23 16:36) [9]


> dabreezy ©   (23.03.06 14:55) [6]


> из обработчика OnTerminate запускались потоки еще раз. Видимо
> делать этого нельзя


Ну почему же нельзя ?
Объект-поток можно создать где угодно ..
Все при этом определяется конечной задачей и разумной/правильной логикой ее реализации.


> глючить и ужирать


Воспользуйся встроенным отладчиком - на то он и дан тебе, чтобы облегчить поиск ошибок в логике.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.013 c
2-1143040746
anubis
2006-03-22 18:19
2006.04.09
Горячие Клавиши


15-1142962553
Dust
2006-03-21 20:35
2006.04.09
Диалог выбора паки


3-1140078523
Yurij-7
2006-02-16 11:28
2006.04.09
BDE и параметр LEVEL


2-1143040341
Profik
2006-03-22 18:12
2006.04.09
Глюк с открытием базы по сети


1-1141382620
Itonix_
2006-03-03 13:43
2006.04.09
Динамическое создание компонента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский