Re: Опять про потоки.
От: vadim77 Израиль  
Дата: 23.11.03 13:19
Оценка: 2 (1)
Здравствуйте, Tarantul, Вы писали:

T>Эта тема, судя по поиску, много раз обсуждаласт но для себя я решения не нашел


T>Вопрос: Как можно главному потоку узнать что рабочий поток завершился? При использовании всяких интересных функций вроде WaitForSingleObject(...), Sleep(...) и подобных в _главном_потоке_ всё замирает: главный поток ожидает события (которое должно оповестить о завершении рабочего потока), а рабочий поток не может установить это событие как раз по причине того, что главный поток весь в ожидании


T>Убивать поток функцией TerminateThread(...) никак нельзя — будет утечка памяти (в моем случае).


Try MsgWaitForMultipleObjectsEx

This is code snippet from the book "MS Press — Programming Applications for MS Windows 4th Edition" by Jeffry Richter

BOOL fQuit FALSE; //Should the loop terminate?

while (!fQuit)
{

//Wake when the kernel object is signaled OR
//if we have to process a UI message.
DWORD dwResult = MsgWaitForMultipleObjectsEx(1, &hYourThreadHandle,
INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE);

switch(dwResult)
{
case WAIT_OBJECT_0: // The event became signaled.
break;

case WAIT_OBJECT_0 + 1: //A message is in our queue.

//Dispatch all of the messages.
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
{
//A WM_QUIT message, exit the loop
fQuit = TRUE;
}
else
{
//Translete and dispatch the message.
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}// Our queue is empty.
break;
}
}//End of while loop
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.