Главная страница
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.027 c
2-1143444583
ms_odin
2006-03-27 11:29
2006.04.09
Как обойти привелегированную инструкцию для записи в порт?


2-1143478492
BOB_KAMIKAZE
2006-03-27 20:54
2006.04.09
ПАНЕЛЬ ЗАДАЧ


2-1143036268
elvis79
2006-03-22 17:04
2006.04.09
как узнать номер выделеной строки в Memo?


2-1143398127
Kolan
2006-03-26 22:35
2006.04.09
Как пользоваться интерфейсом?


2-1143436559
Ошибка
2006-03-27 09:15
2006.04.09
Помогите, ошибка