Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Траблы с WaitForMultipleObjects 19.04.05 10:09
Автор: alex_b Статус: Незарегистрированный пользователь
|
Привет всем!
Столкнулся с проблемой связанной с функцией WaitForMultipleObjects.... При использовании данной функции в MFC приложении, прога виснет намертво, и мне никак не отловить завершения потоков...
Причем заметил, что если вызывать её в деструкторе класса окна, она отрабатывает на ура! Все контролы успевают помереть до вызова деструктора, а вот если вызывать к примеру при нажатии кнопки, прога виснет... Скорее всего это всязано с MFCшными фишками приложения, оно создано, как MFC application
Никто не знает, как обойти сей баг, или как можно в MFCшном приложении грамотно дождаться завершения потоков?
С Уважением,
Алексей...
|
|
ох! messages, messages, messages! 19.04.05 22:16
Автор: + <Mikhail> Статус: Elderman
|
> Привет всем! > > Столкнулся с проблемой связанной с функцией > 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
}
---
|
| |
ну раз ты завел разговор об этом, то можно еще вспомнить о MsgWaitForMultipleObjectsEx 20.04.05 12:42
Автор: _йцукенг_ Статус: Незарегистрированный пользователь
|
MsgWaitForMultipleObjectsEx рулит;-)
|
| | |
конечно можно, но только для MFC это не актуально 20.04.05 20:49
Автор: + <Mikhail> Статус: Elderman
|
|
|
[C++] Скорее всего это связано с тем, что ты не освобождаешь сии объекты... 19.04.05 13:44
Автор: Zef <Alloo Zef> Статус: Elderman
|
Деструктор их прибивает и они освобождаются. Потому в деструкторе не виснет.
В общем: "Код - в студию!"
|
|
совет 19.04.05 12:35
Автор: _йцукенг_ Статус: Незарегистрированный пользователь
|
> Столкнулся с проблемой связанной с функцией > WaitForMultipleObjects.... При использовании данной функции > в MFC приложении, прога виснет намертво, и мне никак не > отловить завершения потоков... > Причем заметил, что если вызывать её в деструкторе класса > окна, она отрабатывает на ура! Все контролы успевают > помереть до вызова деструктора, а вот если вызывать к > примеру при нажатии кнопки, прога виснет...
Итак, что мы имеем.
1) у тебя есть многопоточное MFC-приложение
2) в обработчике события нажатия на кнопку ты вызываешь WaitForMultipleObjects с бесконечным таймаутом, ожидая завершения работы потоков.
3) прога виснет.
4) если вызывать ф-ю в деструкторе класса окна, все нормально.
вывод - твои потоки каким-то образом взаимодействуют с окном, либо ожидают сообщения от этого окна, либо еще чего-то.
а поскольку при вызове WaitForMultipleObjects обработка оконных сообщений останавливается, потоки не завершаются.
рекомендую для того, чтобы сказать потокам о том, что пора закругляться с работой, использовать Event.
пусть они его проверяют, и если он выставлен, завершаются.
PS. MFC не виноват.
|
|
|