Как обработать все сообщения в очереди?

В Delphi есть метод ProcessMessages, который выгребает и обрабатывает все оконные сообщения, которые в данный момент находятся в очереди. Упрощенная реализация этого метода такая

while PeekMessageA(Msg, 0, 0, 0, PM_REMOVE) do begin
  if Msg.Message <> WM_QUIT then begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end else begin
    DoneApplication;
    break;
  end;
end;

(+ некоторые дополнительные вызовы, которые нужны конкретно VCL).

Этот метод можно вызвать вручную из любого места программы.

Вопрос: а есть ли нечто подобное в MFC?

P.S. Я осознаю все побочные эффекты от вызова такого метода и нужен он мне только для отладки многопоточного приложения


Ответы (1 шт):

Автор решения: Anton Shchyrov

Нашел здесь такой код

BOOL bDoingBackgroundProcessing = TRUE;
while (bDoingBackgroundProcessing)
{
   MSG msg;
   while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
   {
      if (!AfxGetApp()->PumpMessage())
      {
         bDoingBackgroundProcessing = FALSE;
         ::PostQuitMessage(0);
         break;
      }
   }
   // let MFC do its idle processing
   LONG lIdle = 0;
   while (AfxGetApp()->OnIdle(lIdle++))
      ;
   // Perform some background processing here 
   // using another call to OnIdle
}

И переделал его в такую функцию

BOOL ProcessMessages() {
    MSG msg;
    while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
        if (!AfxGetApp()->PumpMessage()) {
            ::PostQuitMessage(0);
            return FALSE;
        }
    }
    LONG lIdle = 0;
    while (AfxGetApp()->OnIdle(lIdle++));
    return TRUE;
}
→ Ссылка