![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Узнать о завершении работы потока, как? [D7, WinXP]
tipman © (2009-12-29 11:51:00)Есть основной поток, из него создаю ещё один. Он отрабатывает и завершается сам, т.е. FreeOnTerminate = true. Мне его завершать не надо. Как узнать из основного потока, закончил ли выполнение созданный, стандартными средствми? На данный момент есть переменная, которая в create потока устанавливается в true, в конце Execute, ну или OnTerminate она ставится в false. Думал если он завершается и должен сам разрушаться, попробвать проверить на nil - не тут то было, дескриптор не очищается. Как то можно это сделать не добавлением переменных а какой нить проверкой стандартного свойства скажем или типа того
Сергей М. (2010-01-01 19:27:00) [21]
> И все дела
Ну где же "все" ?
Есть факт обnilения какой-то там переменной, а где факт завершения работы поточной ф-ции ?
Нет его.
Даже после новогодней стопки)
Германн (2010-01-01 03:29:00) [22]
> После шампанского это очень даже занимательное занятие :
> )
Ни разу не пробовал.
А до следующего раза ещё
355 дней :(
P.S. После водки пробовал, но то были обычные будни.
Rouse_ (2010-01-01 02:51:00) [23]Ну у меня есть уважительная причина - я отлаживаю собственнописанный отладчик :) После шампанского это очень даже занимательное занятие :)
Германн (2010-01-01 02:47:00) [24]
> Rouse_ © (01.01.10 02:36) [12]
>
>
Хакер всегда и везде хакер! Даже почти в 3 ночи 1-го января. :)
Rouse_ (2010-01-01 02:36:00) [25]
> Сергей М. © (30.12.09 21:18) [10]
> Нахрена ? Если персонально полученный хендл треда прямо
> перед носом ?
Сереж, не пыли. Это был ответ на вопрос "Как узнать из основного потока, закончил ли выполнение созданный, стандартными средствми".
Под стандартными средствами я подразумеваю нечто уже реализованное, а не то, что еще предстоит реализовать :)
Юрий Зотов (2009-12-31 10:45:00) [26]Чего-то я не понимаю, наверное. Решение-то самое стандартное и лежит на поверхности - так на фига же извращаться?
FThread := TMyThread.Create(True); // FThread - поле формы.
FThread.FreeOnTerminate := True;
FThread.OnTerminate := ThreadTerminate; // ThreadTerminate - метод формы
FThread.Resume;
procedure TForm1.ThreadTerminate(Sender: TObject);
begin
FThread := nil
end;
Теперь в любом месте можно проверить поле FThread - если оно не nil, то поток еще работает. И все дела.
Сергей М. (2009-12-30 21:18:00) [27]
> достаточно сказать GetThreadContext (или вариации
Нахрена ? Если персонально полученный хендл треда прямо перед носом ?
Rouse_ (2009-12-30 17:29:00) [28]Ну для проверки из вне жив или нет, достаточно сказать GetThreadContext (или вариации OpenThread и т.п.)
Сергей М. (2009-12-30 14:55:00) [29]with MyThread do
try
CheckThreadError(GetExitCodeThread(Handle)<>0);
Сергей М. (2009-12-30 13:19:00) [30]
> Мне нужно чтобы основной поток тоже работал
Можно поступить так - как только осн.потоку будет нефига делать и он остановится "покурить", возникнет событие Application.OnIdle.
В его обработчике ты волен проверить, не закруглился ли на сей момент твой доп.поток по хозяйству, и если закруглился то уничтожить его.
Примерно так:
with MyThread do
try
GetExitCodeThread(.CheckThreadError(GetExitCodeThread(Handle)<>0);
// доп.поток гарантированно закруглился - здесь можно забрать у него результаты работы
// перед тем как уничтожить его
Free; // уничтожение доп.потока
except
on EThread do; // доп.поток еще жив и трудится
else
raise; // произошло что-то еще, например, ты забыл или не захотел убрать строчку FreeOnTerminate := True - получи букет граблей
end;
tipman (2009-12-30 12:53:00) [31]Сергей М.
Мне нужно чтобы основной поток тоже работал, а не тормозил, с WaitFor он засыпает. Т.е. опять же тольло либо с симафорами, либо сообщениями? Больше никак?
Сергей М. (2009-12-29 21:20:00) [32]Ишшо один)
~AQUARIUS~ (2009-12-29 20:02:00) [33]TThread.OnTerminate?
Медвежонок Пятачок (2009-12-29 12:28:00) [34]легче тогда и сам поток убрать. и ждать ничего не придется.
Сергей М. (2009-12-29 12:14:00) [35]> Он отрабатывает и завершается сам, т.е. FreeOnTerminate = true
Убирай FreeOnTerminate = true.
В осн.потоке вызывай
MyThread.WaitFor;
.. здесь доп.поток ГАРАНТИРОВАННО завершил свое исполнение ..
MyThread.Free; //а здесь он прекратил свое существование
Sergey Masloff (2009-12-29 11:54:00) [36]Послать сообщение основному потоку при завершении?