Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Узнать о завершении работы потока, как? [D7, WinXP]


Страницы:   1 2

tipman ©   (2009-12-29 11:51:00) 

Есть основной поток, из него создаю ещё один. Он отрабатывает и завершается сам, т.е. FreeOnTerminate = true. Мне его завершать не надо. Как узнать из основного потока, закончил ли выполнение созданный, стандартными средствми? На данный момент есть переменная, которая в create потока устанавливается в true, в конце Execute, ну или OnTerminate она ставится в false. Думал если он завершается и должен сам разрушаться, попробвать проверить на nil - не тут то было, дескриптор не очищается. Как то можно это сделать не добавлением переменных а какой нить проверкой стандартного свойства скажем или типа того


oxffff   (2010-01-05 23:41:00) [1]

Друзья, RegisterWaitForSingleObject  в помощь.
Даже после шампанского, огромной пиццы и кучи конфет. :)


Сергей М.   (2010-01-05 22:25:00) [2]


> Anatoly Podgoretsky ©   (05.01.10 21:55) [34]


Толя, прекрати нести ахинею.


Anatoly Podgoretsky   (2010-01-05 21:55:00) [3]

> Сергей М.  (05.01.2010 21:22:33)  [33]

Думаешь не скоро?


Сергей М.   (2010-01-05 21:22:00) [4]


> вы скоро узнаете о завершение


Ахинея


Anatoly Podgoretsky   (2010-01-05 18:41:00) [5]

> Сергей М.  (05.01.2010 18:08:30)  [30]

Значит вы скоро узнаете о завершение


Демо   (2010-01-05 18:31:00) [6]


> tipman ©   (29.12.09 11:51) 


Проверять при необходимости либо WaitFor(ThreadHandle,0),
Либо в самом экземпляре TThread обнулять переменную, ссылающуюся на этот объект, и при необходимости проверять.


Сергей М.   (2010-01-05 18:08:00) [7]


> Юрий Зотов ©   (05.01.10 00:14) [27]


> Пусть деструктор работает хоть полчаса. Что страшного?


Ну как что ?
Мало ли какая задача у автора ..
В эти полчаса автор, к примеру, запросто может ничтоже сумняшеся попытаться понасоздавать еще кучу тредов и/или поназанимать еще кучу ресурсов .. или обратиться к ресурсам того самого потока ..
Он же, получив тот самый nil, при этом свято уверует в то что поток действительно завершился).. А поток-то жив-здоров и, возможно, выполняет в это время некие важные действия в перекрытом деструкторе..


> Германн ©   (05.01.10 02:11) [28]


Серега, мы тут с Юрием последний огурец режем)
Мож оно кому и поможет кроме автора)


Anatoly Podgoretsky   (2010-01-05 15:13:00) [8]

> Германн  (05.01.2010 02:11:28)  [28]

Ну подумешь бессмысленный набор слов, в первый раз чтоли, и не такое решали, подав повышеную нагрузку на телепатор.


Германн   (2010-01-05 02:11:00) [9]


> Сергей М. ©


> Юрий Зотов ©

И чего вы, ребята полезли в такие дебри, если в сабже написана чушь достойная только помещения в"начинающие":


> На данный момент есть переменная, которая в create потока
> устанавливается в true, в конце Execute, ну или OnTerminate
> она ставится в false. Думал если он завершается и должен
> сам разрушаться, попробвать проверить на nil- не тут то
> было, дескриптор не очищается.


Юрий Зотов   (2010-01-05 00:14:00) [10]

Вырастает. И что? Ничего страшного.

Вот завершающий кусок поточной функции:

FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.DoTerminate;
// Здесь обработчик OnTerminate уже отработал.
Thread.FFinished := True;
SignalSyncEvent;
if FreeThread then
 Thread.Free; // Пусть деструктор работает хоть полчаса. Что страшного?
EndThread(Result);


Сергей М.   (2010-01-04 22:17:00) [11]


> Юрий Зотов ©   (04.01.10 21:47) [25]



> пока он работает в рамках TThread - не хлобыстнут, об этом
> позаботились разработчики VCL


Хлобыстнут, и еще как.
И именно потому, что об этом позаботились разработчики VCL, сделав деструктор Destroy виртуальным.
Достаточно его перекрыть в TThread, беззаботно напичкав тело перекрытого метода разного рода "сложностями", оставив при этом FreeOnTerminate=True - и вот уже между завершением обработчика OnTerminate и фактическим завершением поточной функции вырастает опасная пропасть времени.


Юрий Зотов   (2010-01-04 21:47:00) [12]

> Сергей М. ©   (04.01.10 21:42) [24]

До тех пор, пока он работает в рамках TThread - не хлобыстнут, об этом позаботились разработчики VCL. А когда ему эти рамки станут тесноваты, то он уже и сам сможет писать код без граблей.


Сергей М.   (2010-01-04 21:42:00) [13]


> Что человеку и требовалось. И больше ему не требовалось
> ни-че-го


Когда грабли непонимания этой важной разницы хлобыстнут автора - в этом, Юрий, будет и твоя "заслуга")


Юрий Зотов   (2010-01-03 21:49:00) [14]

> И вызов этого обработчика означает всего лишь факт завершения
> (штатного или по исключению) выполнения метода Execute,

Что человеку и требовалось. И больше ему не требовалось ни-че-го.

И не нужно заниматься "двоичным программизьмом". Я ведь тоже могу им заняться и заявить, что задача нерешаема в принципе - и буду прав. Даже уведомлением главного потока из последнего оператора поточной функции. Даже через WaitForЧтоУгодно.

В принципе - не решаема никак. Однако, это не мешает нам писать реально работающие программы?


Сергей М.   (2010-01-03 20:40:00) [15]


> Юрий Зотов ©   (03.01.10 13:03) [20]


> Обработчик события OnTerminate вызывается в контексте главного
> потока


Тем более.
А дополнительный в это время жив-здоров и ждет возврата из этого обработчика.


> Именно это и означает.


Да нихрена не означает.

Execute - это не поточная функция.
Поточная функция - это функция Classes.ThreadProc.
И завершается она вовсе не при вызове DoTerminate, а при вызове EndThread(). который следует послеDoTerminate.


> OnTerminate event handler to execute code after the thread
> finishes executing


finishes - это не finished.

И вызов этого обработчика означает всего лишь факт завершения (штатного или по исключению) выполнения метода Execute, но никак не завершение выполнения поточной фунукии.


Anatoly Podgoretsky   (2010-01-03 13:13:00) [16]

> Юрий Зотов  (03.01.2010 13:03:20)  [20]

Полностью согласен, завершение работы потока происходит после выхода из метода Execute, после которого только смерть, с оповещением родственников (OnTerminate)


Юрий Зотов   (2010-01-03 13:03:00) [17]

> Сергей М. ©   (02.01.10 19:35) [19]

> "при завершении", согласись, не означает факт ее (поточной функции)
> завершения

Не соглашусь. Именно это и означает.

> ибо обработчик вызывается именно в ее контексте.

Обработчик события OnTerminate вызывается в контексте главного потока.

========================================

Даже спорить не о чем:

Write an OnTerminate event handler to execute code after the thread finishes executing. The OnTerminate event handler is called in the context of the main thread, which means methods and properties can be called freely.


Сергей М.   (2010-01-02 19:35:00) [18]


> Юрий Зотов ©   (02.01.10 14:22) [18]


"при завершении", согласись, не означает факт ее (поточной функции) завершения, ибо обработчик вызывается именно в ее контексте.

Единственным достоверным фактом завершения работы поточной функции является факт сигнала объекта синхронизации - хендла этого потока.


Юрий Зотов   (2010-01-02 14:22:00) [19]

> Сергей М. ©   (01.01.10 19:27) [16]

> Есть факт обnilения какой-то там переменной, а где факт
> завершения работы поточной ф-ции?
> Нет его.
> Даже после новогодней стопки)

Есть факт обnilения переменной В ОБРАБОТЧИКЕ, ВЫЗЫВАЕМОМ ПРИ ЗАВЕРШЕНИИ работы поточной ф-ции.

Даже после новогодней стопки.


Anatoly Podgoretsky   (2010-01-01 20:11:00) [20]


> tipman ©   (29.12.09 11:51)  

Задачу огласи, а не свое представление.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо