Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 stanu bezczynności. Aby uzyskać więcej informacji na temat wielowątkowości, zobacz Tematy dotyczące wielowątkowości.
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 można wykonywać przetwarzanie w czasie bezczynności, dzieląc długi proces na wiele małych fragmentów. Po przetworzeniu każdego fragmentu aplikacja przekazuje kontrolę wykonania systemowi Windows za pomocą pętli PeekMessage.
W tym artykule opisano dwa sposoby przetwarzania w czasie bezczynności 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 również wywołuje funkcję składową OnIdle
z CWinThread
między komunikatami. Aplikacja może przetwarzać komunikaty w tym czasie bezczynności, przesłaniając OnIdle
funkcję.
Uwaga / Notatka
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 w stanie 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 ramach tej pętli pętla zagnieżdżona wielokrotnie wywołuje PeekMessage
. Tak długo, jak wywołanie zwraca wartość niezerową, pętla wywołuje CWinThread::PumpMessage
w celu wykonania normalnego tłumaczenia i wysyłania komunikatów. Chociaż PumpMessage
jest nieudokumentowany, możesz sprawdzić jego kod źródłowy w pliku ThrdCore.Cpp w katalogu \atlmfc\src\mfc instalacji Visual C++.
Po zakończeniu pętli wewnętrznej pętla zewnętrzna wykonuje przetwarzanie w stanie bezczynności z co najmniej jednym wywołaniem metody OnIdle
. Pierwsze wezwanie jest przeznaczone dla celów MFC. Możesz dodatkowo wywołać OnIdle
, aby wykonać własną pracę w tle.
Aby uzyskać więcej informacji na temat wykonywania przetwarzania w stanie bezczynności, zobacz OnIdle w dokumentacji biblioteki MFC.