Przetwarzanie pętlę bezczynności
Wiele aplikacji przetwarzania długich "w"tle. Czasami zagadnienia wydajności dyktować przy użyciu wielowątkowości dla takich prac.Wątki obejmować rozwój dodatkowe obciążenie, więc nie są zalecane dla prostych zadań, takich jak pracy czas bezczynności, co MFC w OnIdle funkcji.Ten artykuł skupia się na przetwarzanie bezczynnego.Aby uzyskać więcej informacji na temat wielowątkowości, zobacz Wielowątkowości tematy.
Niektóre rodzaje przetwarzania w tle jest odpowiednio wykonywana w odstępach czasu, które użytkownik nie jest inaczej interakcji z aplikacją.W aplikacji dla systemu operacyjnego Microsoft Windows aplikacja można wykonywać przetwarzania w czasie bezczynności przez podział długiego procesu na wiele małe fragmenty.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 komunikatów głównych MFC firmy.
Osadzanie innego PeekMessage pętli w innym miejscu w aplikacji.
PeekMessage w pętli komunikatów MFC
W aplikacji z MFC, główna wiadomość pętli w CWinThread klasa zawiera pętli komunikatów, który wywołuje PeekMessage Win32 API.Pętla wywołania OnIdle Członkowskich funkcji CWinThread między wiadomości.Aplikacja przetwarza wiadomości w tym czasie bezczynności nadrzędnym OnIdle funkcji.
[!UWAGA]
Uruchom, OnIdle, oraz niektórych funkcji elementów członkowskich są obecnie członkami klasy CWinThread , a nie klasy CWinApp.CWinApppochodzi z CWinThread.
Aby uzyskać więcej informacji o wydajności przetwarzania bezczynności, zobacz OnIdle w Odniesienia MFC.
PeekMessage gdzie indziej w aplikacji
Inną metodą wykonywania bezczynności przetwarzania w aplikacji polega na osadzanie pętli komunikatów w jednej z funkcji programu.Ta pętla wiadomości jest bardzo podobny do pętli komunikatów głównych MFC firmy, w CWinThread::Run.Oznacza to, wiele funkcji pętli komunikatów głównych wykonać pętlę w aplikacji z MFC.Następujący fragment kodu ilustruje pętli komunikatów, która jest zgodna z MFC pisania:
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 w funkcji, tak długo, jak jest bezczynny przetwarzania zrobić w pętli.W ramach tej pętli zagnieżdżonej pętli wielokrotnie wywołuje PeekMessage.Tak długo, jak tego wywołanie zwraca wartość niezerową, pętli wywołuje CWinThread::PumpMessage do wykonywania translacji normalna wiadomość i wysyłka.Chociaż PumpMessage są udokumentowane, można sprawdzić jego kod źródłowy w pliku ThrdCore.Cpp w katalogu \atlmfc\src\mfc instalacji Visual C++.
Raz wewnętrzna pętla się kończy, zewnętrzna pętla wykonuje przetwarzanie bezczynnego z jednego lub wielu wywołań do OnIdle.Pierwsze wywołanie jest do celów MFC firmy.Można wprowadzić dodatkowe wywołania OnIdle do pracy tła.
Aby uzyskać więcej informacji o wydajności przetwarzania bezczynności, zobacz OnIdle w odwołaniu biblioteki MFC.