Как обработать все сообщения в очереди?
В 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;
}