Главная страница
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.047 c
8-1130349981
Logun
2005-10-26 22:06
2006.04.09
Реал тайм анализ спектрта сигнала со звуковухи


2-1143110357
alles
2006-03-23 13:39
2006.04.09
Как удалить ссылку на Unit из проекта?


2-1143395595
Slash.
2006-03-26 21:53
2006.04.09
установка компонентов


1-1141459613
webpauk
2006-03-04 11:06
2006.04.09
Вставка control


4-1137728229
alex_pv2
2006-01-20 06:37
2006.04.09
Как сказать приложению "Сохранись"