Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.09;
Скачать: CL | DM;

Вниз

как отловить завершение потока?   Найти похожие ветки 

 
aser   (2004-01-04 10:36) [0]

Я создаю поток с помощью ф-ии
h:=CreateThread(nil,0,@FNC,@par,0,ThreadID);
Как мне отследить его завершение? Я так понимаю что нужно делать ловушку с помощью SetWindowsHookEx. Но только что-то ни как не найду на какое событие она(hook) должна реагировать?
Подскажите, плз, какое событие (WM_...) или как по другому отловить завершение потока?


 
Бином Ньютоныч   (2004-01-04 11:43) [1]

Например WaitForSingleObject(h,...) И лучше используй BeginThread вместо CreateThread.


 
aser   (2004-01-04 12:50) [2]

Да спасибо! Я уже и сам нашел эту ф-ю. А кстати, чем лучше BeginThread чем CreateTread???


 
Бином Ньютоныч   (2004-01-04 13:04) [3]

Она обеспечивает кое-какой дополнительный сервис - взводит переменную IsMultiThread и обеспечивает корректную работу механизма обработки исключений


 
aser   (2004-01-04 15:12) [4]

У меня получился такой код:

{1} h:=CreateThread(nil,0,@tst,nil,0,ThreadID);
{2} if WaitForSingleObject(h,INFINITE)=0 then ShowMessage("Цепочка завершилась");
{3}Caption:="Следующая инструкция";
...
...

НО я бы хочу что бы ShowMessage("Цепочка завершилась") выполнилась по завершению потока, а стока {3} и последующие выполнялись сразу. Т.е прогамма работает и работает, а по завершению потока возникает типа прерывание.


 
aser   (2004-01-04 16:30) [5]

Удалено модератором


 
Бином Ньютоныч   (2004-01-04 16:41) [6]

Ты бы лучше сразу написал конкретно, что надо, а не "типа" и "Следующая инструкция", а то так и будем воду толочь. Если нужна обработка сообщений, то примерно так:
h:=CreateThread(nil,0,@tst,nil,0,ThreadID);
repeat
case MsgWaitForMultipleObjects(1, h, false, qs_allevents) of
wait_object_0:
begin
ShowMessage("Цепочка завершилась");
Break;
end;
wait_object_0 + 1: Application.ProcessMessages;
else ErrorHandling;
end;
until Application.Terminated;


 
Ihor Osov'yak ©   (2004-01-04 16:47) [7]

Хм.. А кто тебе мешает в конце FNC запостить (PostMessage) какое-то нотификационное сообщение..
Если же этого делать не хочешь, то все равно придется периодически вызывать
WaitForSingleObject в каком-то цыкле наблюдения, или по таймеру, но уже не с INFINITE, а c 0 (вызов с 0 не приводит к "застреванию" на WaitForSingleObject пока поток не окончен..), и анализировать возращаемое значение, примерно так, как я говорил в ветке http://delphimaster.net/view/1-1073201169/
Зы. Есть еще другие способа, но они, имхо, еще более кривые, чем периодическое дергание WaitForSingleObject(h, 0), что также есть немного криво...


 
aser   (2004-01-04 17:22) [8]

Спасибо. Но видимо надо объяснить совсем конкретно. Программа написана не на API, а с использованием VCL. Хотелось бы что бы код выглядел как то так:

...
var
h:THandle=0;
...
procedure TForm1.ButtonAClick(Sender: TObject);
var
ThreadID:Cardinal;
f:DWORD;
begin
h:=CreateThread(nil,0,@tst,nil,0,ThreadID);
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
// !!
УСТАНОВКА_ОБРАБОТЧИКА_НА_СОБЫТИЕ_"завершение_потока_h"
// !!
end;


 
Бином Ньютоныч   (2004-01-04 18:12) [9]

Есть толко 3 способа:
1)функция ожидания с обработкой очереди сообщений или без
2)Отправка сообщения из потока перед самым завершением + опять же ожидание, если нужна гарантия, что поток точно завершился.
3)Генерация события прямо из потока.

Можно еще использовать очередь асинхронных вызовов, но практически то-же самое, что и отправка сообщения. Других способов нет.


 
Ihor Osov'yak ©   (2004-01-04 20:15) [10]

что то ты немного... эта... Темнишь. Во!
Поток с помощью апишных вызовов создаешь, а потом от апи хвункциональности VCL

требуешь.. Непоследовательно как то. Если все же апи, то смотри [9]..
Если VCL - то смотри в сторону TThread, в частности на OnTerminate.
Только учти, что зацепка OnTerminate возникает еще перед окончанием потока, но уже после отработки Execute и в контексте потока.. См. модуль
classes.pas, function ThreadProc (реализацию смотри, чтобы понять, когда OnTerminate "fired")



Страницы: 1 вся ветка

Текущий архив: 2004.03.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
7-25948
voronn
2003-12-19 16:32
2004.03.09
загрузка программ в Win2k


11-25725
avakss
2003-06-19 18:42
2004.03.09
KOLFTP


1-25741
Goida
2004-02-26 17:10
2004.03.09
Точное время!


14-25880
nazgul
2004-02-15 12:30
2004.03.09
Сокетное соединение..


14-25896
Тимохов
2004-02-11 11:23
2004.03.09
Рихтер I