Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
7-25950
YuRock
2003-12-19 14:47
2004.03.09
Программы для работы с измерителем VEEDER-ROOT


1-25768
sapsi
2004-02-26 10:48
2004.03.09
Минимизация формы


1-25781
Danilin
2004-02-25 13:30
2004.03.09
Странное поведение TIniFile


1-25734
Islander
2004-02-26 00:59
2004.03.09
Как отловить отмену редактирования ноды?


3-25685
PavelSin
2004-02-11 09:42
2004.03.09
EhLib first line





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