Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.084 c
2-1143284734
Толян
2006-03-25 14:05
2006.04.09
рисование таблицы


6-1135444189
FrykT
2005-12-24 20:09
2006.04.09
SSL + WinSock, как реализовать?


15-1142403938
Emik
2006-03-15 09:25
2006.04.09
FIBPlus Tools


11-1123713644
Thaddy
2005-08-11 02:40
2006.04.09
Why does kol and D2005 seem to work only in PAS_VERSION mode?


2-1143042991
mrAndersen
2006-03-22 18:56
2006.04.09
CopyFile