Udostępnij za pośrednictwem


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

Zobacz też

Tematy ogólne dotyczące MFC