Udostępnij za pośrednictwem


Przetwarzanie pętli bezczynnej

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, OnIdlei 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.

Zobacz także

Ogólne tematy MFC