在
調用SendMessage 產生死鎖的問題分析 ???? 之后,我在界面程序中不再使用 WaitForSingleObject 了,而改用如下的函數
?
DWORD WaitObjectAndMsg(HANDLE hEventThread, DWORD dwMilliseconds)
?{
??BOOL? bWait?? =? TRUE;
??DWORD dwEvt = 0;
??
??while(bWait)
??{
???DWORD dwEvt = ::MsgWaitForMultipleObjects(1 , &hEventThread, FALSE, dwMilliseconds, QS_ALLINPUT);
???
???switch (dwEvt)
???{
???case WAIT_OBJECT_0:???????
????{
?????return WAIT_OBJECT_0;
????}
????break;
????
???case WAIT_OBJECT_0 + 1:????
????{
?????MSG msg;
?????while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
?????{
??????if( WM_CLOSE == msg.message || WM_QUIT == msg.message )
??????{
???????return WAIT_FAILED;
???????break;
??????}
??????else?
??????{
???????PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
????????::TranslateMessage(&msg);??
????????::DispatchMessage(&msg);???
??????}
?????}
?????break;
????}
????
???default:??
????{
?????return dwEvt;
?????break;
????}
????
???}?
??}
??
??return dwEvt;
?}
?
這個函數看起來不錯,在等待一個 Object 的同時,還可以邊等待,邊處理消息
今天才發現,這樣處理有缺陷
如果在等待一個Object 時,哪怕只有 0.00001 秒,這里如果一個不小心處理了消息
????那么?很自然會走到這個語句???::DispatchMessage(&msg);?????
經過調試發現,?????????::DispatchMessage(&msg);??? 是阻塞的,
如果在處理消息的函數里,調用了一個
CDialog dlg;
dlg.DoModal();???? 這里也是阻塞的, 如果這個窗口一直不關閉,
即使這時候 Object 已經響應了,但這個函數仍然不返回,,,,,,,因為它在雙重的消息處理中。。。。。。。