Главная страница
    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.47 MB
Время: 0.012 c
2-1143534359
Barksy
2006-03-28 12:25
2006.04.09
Какую клиент-серверную базу выбрать?


2-1143303177
Farpik
2006-03-25 19:12
2006.04.09
Небольшие вопросики!


2-1143195076
vova_vova
2006-03-24 13:11
2006.04.09
закрытие


2-1143033318
sanich
2006-03-22 16:15
2006.04.09
Как динамически формировать имя переменной?


15-1142888315
xlsn
2006-03-20 23:58
2006.04.09
WebMoney





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский