在
調(diào)用SendMessage 產(chǎn)生死鎖的問題分析 ???? 之后,我在界面程序中不再使用 WaitForSingleObject 了,而改用如下的函數(shù)
?
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;
?}
?
這個(gè)函數(shù)看起來不錯(cuò),在等待一個(gè) Object 的同時(shí),還可以邊等待,邊處理消息
今天才發(fā)現(xiàn),這樣處理有缺陷
如果在等待一個(gè)Object 時(shí),哪怕只有 0.00001 秒,這里如果一個(gè)不小心處理了消息
????那么?很自然會走到這個(gè)語句???::DispatchMessage(&msg);?????
經(jīng)過調(diào)試發(fā)現(xiàn),?????????::DispatchMessage(&msg);??? 是阻塞的,
如果在處理消息的函數(shù)里,調(diào)用了一個(gè)
CDialog dlg;
dlg.DoModal();???? 這里也是阻塞的, 如果這個(gè)窗口一直不關(guān)閉,
即使這時(shí)候 Object 已經(jīng)響應(yīng)了,但這個(gè)函數(shù)仍然不返回,,,,,,,因?yàn)樗陔p重的消息處理中。。。。。。。