Столкнулся с проблемой связанной с функцией WaitForMultipleObjects.... При использовании данной функции в MFC приложении, прога виснет намертво, и мне никак не отловить завершения потоков...
Причем заметил, что если вызывать её в деструкторе класса окна, она отрабатывает на ура! Все контролы успевают помереть до вызова деструктора, а вот если вызывать к примеру при нажатии кнопки, прога виснет... Скорее всего это всязано с MFCшными фишками приложения, оно создано, как MFC application
Никто не знает, как обойти сей баг, или как можно в MFCшном приложении грамотно дождаться завершения потоков?
> Привет всем! > > Столкнулся с проблемой связанной с функцией > WaitForMultipleObjects.... При использовании данной функции > в MFC приложении, прога виснет намертво, и мне никак не > отловить завершения потоков... > Причем заметил, что если вызывать её в деструкторе класса > окна, она отрабатывает на ура! Все контролы успевают > помереть до вызова деструктора, а вот если вызывать к > примеру при нажатии кнопки, прога виснет... Скорее всего > это всязано с MFCшными фишками приложения, оно создано, как > MFC application > > Никто не знает, как обойти сей баг, или как можно в MFCшном > приложении грамотно дождаться завершения потоков? > > С Уважением, > Алексей...
ох! messages, messages, messages!
используй MsgWaitForMultipleObjects например вот так:
bool WaitWithMessageLoop(HANDLE hEvent)
{
DWORD dwRet;
MSG msg;
while(1)
{
dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT);
if(dwRet == WAIT_OBJECT_0)
return true; // The event was signaled
if(dwRet != WAIT_OBJECT_0 + 1)
return false; // Something else happened
// There is one or more window message available. Dispatch them
while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
if(WM_QUIT == msg.message)
return false;//application terminates
TranslateMessage(&msg);
DispatchMessage(&msg);
if(WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
return true; // Event is now signaled.
}
}
return false;//never goes here
}
---
ну раз ты завел разговор об этом, то можно еще вспомнить о MsgWaitForMultipleObjectsEx20.04.05 12:42 Автор: _йцукенг_ Статус: Незарегистрированный пользователь
> Столкнулся с проблемой связанной с функцией > WaitForMultipleObjects.... При использовании данной функции > в MFC приложении, прога виснет намертво, и мне никак не > отловить завершения потоков... > Причем заметил, что если вызывать её в деструкторе класса > окна, она отрабатывает на ура! Все контролы успевают > помереть до вызова деструктора, а вот если вызывать к > примеру при нажатии кнопки, прога виснет...
Итак, что мы имеем.
1) у тебя есть многопоточное MFC-приложение
2) в обработчике события нажатия на кнопку ты вызываешь WaitForMultipleObjects с бесконечным таймаутом, ожидая завершения работы потоков.
3) прога виснет.
4) если вызывать ф-ю в деструкторе класса окна, все нормально.
вывод - твои потоки каким-то образом взаимодействуют с окном, либо ожидают сообщения от этого окна, либо еще чего-то.
а поскольку при вызове WaitForMultipleObjects обработка оконных сообщений останавливается, потоки не завершаются.
рекомендую для того, чтобы сказать потокам о том, что пора закругляться с работой, использовать Event.
пусть они его проверяют, и если он выставлен, завершаются.