2010-06-05 2 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의 모든 곳에 있으며, 가장 일반적인 예로 클립 보드, 끌어서 놓기 및 셸 대화 상자가 있습니다. COM은 메시지 루프를 사용하여 STA (단일 스레드 아파트)에있는 COM 개체에 대해 작업자 스레드에서 만든 인터페이스 메서드 호출을 마샬링합니다. STA 스레드가 메시지를 펌핑하지 않으면 호출이 완료되지 않습니다. 그리고 완료 할 수없는 호출은 교착 상태에 대한 재료 번호 1입니다. 작업자 스레드가 완료되고 교착 상태가 확인 될 때까지 대기하는 UI 스레드를 추가하십시오.

작업 스레드가 중요한 일이 발생했음을 UI 스레드에 알리기 위해 PostMessage()를 사용하면 이러한 종류의 코드를 피할 수 있습니다.