多线程Win32 GUI消息循环

cpx*_*cpx 1 winapi multithreading

什么时候需要在多线程应用程序中使用这种类型的修改消息循环?

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

希望永远不会.但是,当您希望UI线程阻止同步对象时,您必须编写这种代码.不允许阻止UI线程,Windows阻止您调用WaitForMultipleObjects().原因是它可能导致死锁.

原因是COM.COM在Windows中无处不在,最常见的例子是剪贴板,拖放和shell对话框.COM通过使用消息循环对来自STA(单线程单元)上的COM对象的工作线程进行接口方法调用.如果STA线程没有泵送消息,则呼叫将不会完成.并且无法完成的调用是死锁的第一个成分.添加等待工作线程完成的UI线程,并确保死锁.

通过让工作线程使用PostMessage()向UI线程发出重要事件发生的信号来避免这种代码.