Freigeben über


Leerlaufschleifen-Verarbeitung

Viele Anwendungen führen eine langwierige Verarbeitung "im Hintergrund" durch. Manchmal diktieren Leistungsüberlegungen die Verwendung von Multithreading für diese Arbeit. Threads erfordern zusätzlichen Entwicklungsaufwand, sodass sie für einfache Aufgaben wie die Leerlaufzeitarbeit, die MFC in der OnIdle-Funktion ausführt, nicht empfohlen werden. Dieser Artikel konzentriert sich auf die Leerlaufverarbeitung. Weitere Informationen zum Multithreading finden Sie unter "Multithreading Topics".

Einige Arten der Hintergrundverarbeitung werden in Intervallen entsprechend ausgeführt, die der Benutzer sonst nicht mit der Anwendung interagiert. In einer Anwendung, die für das Microsoft Windows-Betriebssystem entwickelt wurde, kann eine Anwendung Leerlaufzeitverarbeitung durchführen, indem ein langwieriger Prozess in viele kleine Fragmente aufgeteilt wird. Nach der Verarbeitung jedes Fragments liefert die Anwendung die Ausführungskontrolle für Windows mithilfe einer PeekMessage-Schleife .

In diesem Artikel werden zwei Möglichkeiten zum Ausführen der Leerlaufverarbeitung in Ihrer Anwendung erläutert:

  • Verwenden von PeekMessage in der Standard Nachrichtenschleife von MFC.

  • Einbetten einer anderen PeekMessage-Schleife an einer anderen Stelle in der Anwendung.

PeekMessage in der MFC-Nachrichtenschleife

In einer mit MFC entwickelten Anwendung enthält die Standard Nachrichtenschleife in der CWinThread Klasse eine Nachrichtenschleife, die die PeekMessage Win32-API aufruft. Diese Schleife ruft auch die OnIdle Memberfunktion zwischen CWinThread Nachrichten auf. Eine Anwendung kann Nachrichten in dieser Leerlaufzeit verarbeiten, indem die OnIdle Funktion überschrieben wird.

Hinweis

Run, OnIdleund bestimmte andere Memberfunktionen sind jetzt Member der Klasse CWinThread und nicht der Klasse CWinApp. CWinApp wird von CWinThread abgeleitet.

Weitere Informationen zum Ausführen der Leerlaufverarbeitung finden Sie unter OnIdle in der MFC-Referenz.

PeekMessage an anderer Stelle in Ihrer Anwendung

Eine weitere Methode zum Ausführen der Leerlaufverarbeitung in einer Anwendung umfasst das Einbetten einer Nachrichtenschleife in eine Ihrer Funktionen. Diese Nachrichtenschleife ist der Standard Nachrichtenschleife von MFC sehr ähnlich, die in CWinThread::Run zu finden ist. Dies bedeutet, dass eine solche Schleife in einer anwendung, die mit MFC entwickelt wurde, viele der gleichen Funktionen wie die Standard Nachrichtenschleife ausführen muss. Das folgende Codefragment veranschaulicht das Schreiben einer Nachrichtenschleife, die mit MFC kompatibel ist:

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
}

Dieser Code, der in eine Funktion eingebettet ist, wird in einer Schleife ausgeführt, solange eine Leerlaufverarbeitung erforderlich ist. Innerhalb dieser Schleife wird wiederholt eine geschachtelte Schleife aufgerufen PeekMessage. Solange dieser Aufruf einen Wert ungleich Null zurückgibt, ruft die Schleife aufruft CWinThread::PumpMessage , um eine normale Nachrichtenübersetzung und -verteiler durchzuführen. Obwohl PumpMessage nicht dokumentiert ist, können Sie den Quellcode in der Datei "ThrdCore.Cpp" im Verzeichnis "\atlmfc\src\mfc" Ihrer Visual C++-Installation untersuchen.

Sobald die innere Schleife endet, führt die äußere Schleife eine Leerlaufverarbeitung mit einem oder mehreren Aufrufen durch OnIdle. Der erste Aufruf richtet sich an die Zwecke von MFC. Sie können zusätzliche Aufrufe tätigen, um OnIdle Ihre eigene Hintergrundarbeit auszuführen.

Weitere Informationen zum Ausführen der Leerlaufverarbeitung finden Sie unter "OnIdle " in der MFC-Bibliotheksreferenz.

Siehe auch

Allgemeine MFC-Themen