什么时候需要在多线程应用程序中使用这种类型的修改消息循环?
DWORD nWaitCount;
HANDLE hWaitArray[4];
BOOL quit;
int exitCode;
while (!quit)
{
MSG msg;
int rc;
rc = MsgWaitForMultipleObjects(nWaitCount, hWaitArray, FALSE, INFINITE,QS_ALLINPUT);
if (rc == WAIT_OBJECT_O + nWaitCount)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
quit = TRUE;
exitCode = msg.wParam;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else if (rc >= WAIT_OBJECT_0 && rc < WAIT_OBJECT_0 + nwaitCount)
{
int nlndex = rc - WAIT_OBJECT_0;
}
else if (rc >= WAIT_ABANDONED_0 && rc < WAIT_ABANDONED_0+ nWaitCount)
{
int nlndex = rc - WAIT_ABANDONED_O;
}
}
答案 0 :(得分:5)
希望永远不会。但是,当您希望UI线程阻止同步对象时,它是您有编写的代码。不允许阻止UI线程,Windows阻止您调用WaitForMultipleObjects()。原因是非常可能导致死锁。
原因是COM。 COM在Windows中无处不在,最常见的例子是剪贴板,拖放和shell对话框。 COM通过使用消息循环对来自STA(单线程单元)上的COM对象的工作线程进行接口方法调用。如果STA线程没有泵送消息,则呼叫将不会完成。并且无法完成的调用是死锁的第一个成分。添加一个等待工作线程完成的UI线程,并确保死锁。
通过让工作线程使用PostMessage()向UI线程发出重要事件发生的信号来避免这种代码。