Многопоточный цикл сообщений Win32 GUI - PullRequest
1 голос
/ 05 июня 2010

Когда вам нужно использовать этот тип модифицированного цикла сообщений в многопоточном приложении?

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

1 Ответ

5 голосов
/ 05 июня 2010

Надеюсь, никогда. Но это тот код, который вы должны писать , когда хотите, чтобы поток пользовательского интерфейса блокировал объекты синхронизации. Поток пользовательского интерфейса не разрешается блокировать, Windows не позволяет вам вызывать WaitForMultipleObjects (). Причина в том, что очень может вызвать тупик.

Причиной этого является COM. COM везде в Windows, наиболее распространенными примерами являются буфер обмена, перетаскивание и диалоги оболочки. Вызовы методов интерфейса COM marshals, сделанные из рабочего потока для объектов COM, которые живут в STA (Single Threaded Apartment) с помощью цикла сообщений. Если поток STA не перекачивает сообщения, то вызов не будет завершен. И звонки, которые не могут быть завершены, являются ингредиентом номер один для тупика. Добавьте поток пользовательского интерфейса, который ожидает завершения рабочего потока, и гарантируется взаимоблокировка.

Вы избегаете такого рода кода, когда рабочий поток использует PostMessage (), чтобы сигнализировать потоку пользовательского интерфейса, что произошло что-то важное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...