主线程中不能使用 WaitForSingleObject(m_GameProcessInfo.hProcess, INFINITE);
这样会造成莫名奇妙的问题,比如我在一个项目这样用了,结果客户反馈说程序会造成鼠标一在转圈圈。经远程远程客户机排查,结果就是在主线程中使用WaitForSingleObject(m_GameProcessInfo.hProcess, INFINITE); 导致了主线程消息循环阻塞而引发的。
经过在网上查找,很快找到了解决方案,用下面的代码取代WaitForSingleObject.
while (TRUE)
{
DWORD result;
MSG msg;
result = MsgWaitForMultipleObjects(1, &m_GameProcessInfo.hProcess,
FALSE, INFINITE, QS_ALLINPUT);
if (result == ( WAIT_OBJECT_0))
{
break;
}
else
{
PeekMessage(&msg, NULL , 0, 0, PM_REMOVE );
DispatchMessage(&msg);
}
}
微软对此函数的解释是:
为了解决在主线程中Wait的问题,微软专门设计了一个函数MsgWaitForMultipleObjects,这个函数即可以等待信号(thread,event,mutex等等),也可以等待消息(MSG)。即不论有信号被激发或者有消息到来,此函数都可以返回。
这样改过后,再发给客户测试,现象消失,问题解决。
本文为“老吴笔记”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。