Przetwarzanie pętli bezczynności
Wiele aplikacji wykonaj przetwarzanie długiego "w"tle. Czasami zagadnienia dotyczące wydajności dyktować za pomocą wielowątkowości dla takich prac.Tematy obejmują rozwoju dodatkowe obciążenie, więc nie są zalecane dla prostych zadań, takich jak praca czas bezczynności, który MFC nie w OnIdle funkcji.Ten artykuł skupia się na przetwarzanie bezczynności.Aby uzyskać więcej informacji na temat wielowątkowość, zobacz Wielowątkowości tematy.
Niektóre rodzaje przetwarzania w tle jest odpowiednio wykonywana w odstępach czasu, których użytkownik nie jest inny sposób interakcji z aplikacją.W aplikacji, opracowany dla systemu operacyjnego Microsoft Windows aplikacja może wykonywać przetwarzania w czasie bezczynności przez podział długi proces na wiele małych fragmentów.Po przetworzeniu każdego fragmentu, aplikacja daje wykonanie kontroli do systemu Windows za pomocą PeekMessage pętli.
W tym artykule wyjaśniono bezczynności przetwarzania w aplikacji na dwa sposoby:
Za pomocą PeekMessage w pętli głównej wiadomości MFC.
Osadzanie innego PeekMessage pętli gdzieś indziej w aplikacji.
PeekMessage w pętli komunikatów MFC
W aplikacji, opracowany z MFC, głównym przesłaniem pętli w CWinThread klasa zawiera pętli komunikatów, który wywołuje PeekMessage interfejsu Win32 API.Pętla wywołania OnIdle funkcji składowej z CWinThread między wiadomościami.Aplikacja może przetwarzać wiadomości w ciągu tego czasu bezczynności przez zastąpienie OnIdle funkcji.
[!UWAGA]
Uruchom, OnIdle, a pewne funkcje składowe są teraz członkowie klasy CWinThread , a nie klasy CWinApp.CWinApppochodzi z CWinThread.
Aby uzyskać więcej informacji dotyczących wykonywania przetwarzania bezczynności, zobacz OnIdle w Odwołanie MFC.
PeekMessage gdzie indziej w aplikacji
Inna metoda przeprowadzania bezczynności przetwarzania w aplikacji polega na osadzanie pętli komunikatów w jednej z funkcji.Ta pętla wiadomości jest bardzo podobny do pętli głównej wiadomości MFC, znalezione w CWinThread::Run.Oznacza to pętlę w aplikacji opracowanych MFC musi wykonać wiele z tych samych funkcji, pętli głównej wiadomości.Poniższy fragment kodu ilustruje pisanie pętli komunikatów, która jest zgodna z MFC:
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
}
Ten kod, osadzony w przypadku funkcji pętle tak długo, jak długo jest bezczynny przetwarzania robić.W ramach tej pętli powtarzalnie wywołuje zagnieżdżonej pętli PeekMessage.Tak długo, jak długo ten wywołanie zwraca wartość różną od zera, pętla wywołuje CWinThread::PumpMessage do wykonywania translacji wiadomość normalna i wysyłki.Chociaż PumpMessage jest nieudokumentowane, można sprawdzić jego kod źródłowy w pliku ThrdCore.Cpp w katalogu \atlmfc\src\mfc w instalacji programu Visual C++.
Po zakończeniu pętli wewnętrznej zewnętrznej pętli przetwarza bezczynności z jednego lub wielu wywołań do OnIdle.Pierwsze wywołanie jest do celów MFC.Można wykonywać dodatkowe połączenia do OnIdle do pracy tła.
Aby uzyskać więcej informacji dotyczących wykonywania przetwarzania bezczynności, zobacz OnIdle w odwołaniu biblioteki MFC.