如果两个线程拥有任何关系类型的窗口,那么它们很容易耦合。
这样做的有效结果是,您的IPC调用在等待应答时无法阻塞-您的IPC读取始终需要使用
MsgWaitForMultipleObjects
以便您可以在等待指示完成的IPC消息时处理来自其他进程/线程的窗口消息。
您要做的是将当前对WaitForMultipleObjects的调用替换为MSGWaitForMultipleObjects。当它返回时,检查返回值。如果nCount是等待接收信号的IPC句柄数:
// Pump messages while waiting on 0 or more handles.
for(;;)
{
while(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DWORD ret = MsgWaitForMultipleObjects(nCount,pHandles,FALSE,dwTimeout,QS_ALLEVENTS);
if(ret >= WAIT_OBJECT_0 && ret < (WAIT_OBJECT_0 + nCount))
{
// one of the handles was signalled.
return ret;
}
else if(ret == WAIT_OBJECT_0 + nCount)
{
// The wait was aborted because there is at least one message,
// go back to pumping messages
continue;
}
else
{
// test for WAIT_OBJECT_ABANDONED_0, WAIT_TIMEOUT etc. as appropriate
}
}