MsgWaitForMultipleObjects
2009-08-09 10:32
337 查看
在 调用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 已经响应了,但这个函数仍然不返回,,,,,,,因为它在双重的消息处理中。。。。。。。
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 已经响应了,但这个函数仍然不返回,,,,,,,因为它在双重的消息处理中。。。。。。。
相关文章推荐
- 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects) --代替方法:MsgWaitForMultipleObjects
- C++ 多线程阻塞 (多线程同步)(MsgWaitForMultipleObjects)
- WaitForMultipleObject与MsgWaitForMultipleObjects的用法
- WaitForSingleObject或MsgWaitForMultipleObjects函数无返回,程序直接退出问题
- MsgWaitForMultipleObjects 后遗症 与解决办法
- 线程函数的设计以及线程同步要点(MsgWaitForMultipleObjects等)
- MsgWaitForMultipleObjects 的解释
- 改进的延时函数Delay(使用MsgWaitForMultipleObjects等待消息或超时的到来)
- MsgWaitForMultipleObjects_测试
- MsgWaitForMultipleObjects
- 线程函数的设计以及线程同步要点(MsgWaitForMultipleObjects等)
- WaitForMultipleObject与MsgWaitForMultipleObjects的用法
- MsgWaitForMultipleObjects WaitForMultipleObjects
- MsgWaitForMultipleObjects 都做了什么
- MsgWaitForMultipleObjects
- WaitForMultipleObject与MsgWaitForMultipleObjects用法 .
- 多线程和MsgWaitForMultipleObjects
- 线程函数的设计以及线程同步要点(MsgWaitForMultipleObjects等)
- 从WaitForMultipleObject到MsgWaitForMultipleObjects
- MsgWaitForMultipleObjects