2010-06-05 73 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線程發出重要信息,避免出現這種類型的代碼。