Форум: "Начинающим";
Текущий архив: 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