Przetwarzanie pętli bezczynności
Wiele aplikacji wykonuje długie przetwarzanie "w tle". Czasami zagadnienia dotyczące wydajności określają użycie wielowątków do takiej pracy. Wątki obejmują dodatkowe nakłady pracy programistycznej, dlatego nie są zalecane w przypadku prostych zadań, takich jak praca w czasie bezczynności wykonywana przez MFC w funkcji OnIdle . Ten artykuł koncentruje się na przetwarzaniu bezczynności. Aby uzyskać więcej informacji na temat wielowątków, zobacz Tematy wielowątku.
Niektóre rodzaje przetwarzania w tle są odpowiednio wykonywane w odstępach czasu, w których użytkownik nie wchodzi w interakcję z aplikacją. W aplikacji opracowanej dla systemu operacyjnego Microsoft Windows aplikacja może wykonywać przetwarzanie bezczynności, dzieląc długi proces na wiele małych fragmentów. Po przetworzeniu każdego fragmentu aplikacja daje kontrolę wykonywania w systemie Windows przy użyciu pętli PeekMessage .
W tym artykule opisano dwa sposoby bezczynności przetwarzania w aplikacji:
Używanie funkcji PeekMessage w głównej pętli komunikatów MFC.
Osadzanie innej pętli PeekMessage w innym miejscu w aplikacji.
PeekMessage w pętli komunikatów MFC
W aplikacji opracowanej za pomocą MFC główna pętla komunikatów w CWinThread
klasie zawiera pętlę komunikatów, która wywołuje interfejs API PeekMessage Win32. Ta pętla wywołuje OnIdle
również funkcję CWinThread
składową między komunikatami. Aplikacja może przetwarzać komunikaty w tym czasie bezczynności, przesłaniając OnIdle
funkcję.
Uwaga
Run
, OnIdle
i niektóre inne funkcje składowe są teraz członkami klasy CWinThread
, a nie klasy CWinApp
. CWinApp
pochodzi z CWinThread
.
Aby uzyskać więcej informacji na temat wykonywania przetwarzania bezczynności, zobacz OnIdle w dokumentacji MFC.
PeekMessage gdzie indziej w aplikacji
Inną metodą wykonywania bezczynnego przetwarzania w aplikacji jest osadzanie pętli komunikatów w jednej z funkcji. Ta pętla komunikatów jest bardzo podobna do głównej pętli komunikatów MFC znajdującej się w pliku CWinThread::Run. Oznacza to, że taka pętla w aplikacji opracowanej za pomocą MFC musi wykonywać wiele takich samych funkcji jak główna pętla komunikatów. Poniższy fragment kodu przedstawia pisanie pętli komunikatów zgodnej 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 funkcji, zapętla się tak długo, jak jest bezczynne przetwarzanie do wykonania. W tej pętli pętla zagnieżdżona wielokrotnie wywołuje metodę PeekMessage
. Tak długo, jak wywołanie zwraca wartość niezerową, pętla wywołuje normalne CWinThread::PumpMessage
tłumaczenie i wysyłanie komunikatów. Mimo PumpMessage
że jest nieudokumentowany, możesz sprawdzić jego kod źródłowy w pliku ThrdCore.Cpp w katalogu \atlmfc\src\mfc instalacji języka Visual C++.
Po zakończeniu pętli wewnętrznej pętla zewnętrzna wykonuje bezczynne przetwarzanie z co najmniej jednym wywołaniam metody OnIdle
. Pierwsze wezwanie jest przeznaczone dla celów MFC. Możesz wykonywać dodatkowe wywołania, aby OnIdle
wykonać własną pracę w tle.
Aby uzyskać więcej informacji na temat wykonywania przetwarzania bezczynności, zobacz OnIdle w dokumentacji biblioteki MFC.