2010-06-05 76 views
1

您何时需要在多线程应用程序中使用此类修改的消息循环?多线程Win32 GUI消息循环

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; 
    } 
} 

回答

5

希望永远不会。但是当你希望UI线程在同步对象上阻塞时,它是你编写的那种代码。 UI线程不被允许阻止,Windows阻止您调用WaitForMultipleObjects()。原因是它很可能会造成死锁,很可能

原因是COM。 COM在Windows中无处不在,最常见的例子是剪贴板,拖放和shell对话框。通过使用消息循环,COM编组接口通过工作线程为驻留在STA(单线程公寓)上的COM对象创建的方法调用。如果STA线程没有泵送消息,则呼叫不会完成。而不能完成的呼叫是僵局的第一要素。添加一个等待工作线程完成并确保死锁的UI线程。

您可以通过让工作线程使用PostMessage()向UI线程发出重要信息,避免出现这种类型的代码。