MsgWaitForMultipleObjects

本文分析了在界面程序中使用特定等待函数导致的死锁问题。通过实例展示了如何避免因双重消息处理引发的阻塞,并提出了改进措施。

调用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 已经响应了,但这个函数仍然不返回,,,,,,,因为它在双重的消息处理中。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值