Freigeben über


Leerlaufschleifen-Verarbeitung

Viele Anwendungen führen das langwierige Verarbeitung "im Hintergrund" aus. Manchmal schreiben Leistungsüberlegungen mit Multithreading für diese Arbeit vor. Threads werden zusätzliche Entwicklungsmehraufwand mit ein, sodass sie nicht für einfache Aufgaben wie die Leerlaufarbeit empfohlen, dass MFC in der OnIdle-Funktion ausführt. Dieser Artikel beschreibt schwerpunktmäßig Leerlaufverarbeitung. Weitere Informationen über Multithreading, finden Sie unter Multithreading-Themen.

Einige Arten Hintergrundverarbeitung sind entsprechend während der Zeitintervalle derjenigen, dass der Benutzer nicht andernfalls mit der Anwendung. In Anwendungen, die für das Microsoft Windows-Betriebssystem entwickelt wurde, kann eine Anwendung im Leerlauf ausführen, indem sie einen aufwändigen Prozess in viele kleine Fragmente verarbeitet, unterteilt. Nachdem sie jedes Fragment verarbeitet hat, führt die Anwendung Ausführungssteuerung zu Windows mithilfe einer PeekMessage Schleife.

Dieser Artikel beschreibt zwei Möglichkeiten, Leerlaufverarbeitung in der Anwendung auszuführen:

  • Die Verwendung von PeekMessage auf Hauptnachrichtenschleife MFC.

  • Eine weitere PeekMessage Schleife in der Anwendung auf einbetten.

PeekMessage in der MFC-Nachrichtenschleife

In einer Anwendung, die mit MFC entwickelt wurde, enthält der Hauptnachrichtenschleife in der CWinThread-Klasse eine Nachrichtenschleife, die die PeekMessage Win32-API aufruft. Die Schleife ruft außerdem die OnIdle-Memberfunktion von CWinThread zwischen Meldungen auf. Eine Anwendung kann Meldungen in der Leerlaufzeit verarbeiten, indem sie die OnIdle-Funktion überschreibt.

Hinweis

Ausführen, OnIdle und bestimmte andere Memberfunktionen sind jetzt Member der Klasse CWinThread und der CWinApp- Klasse.CWinApp ist von CWinThread abgeleitet.

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

PeekMessage an anderer Stelle in der Anwendung

Eine weitere Methode zum Ausführen von Leerlaufverarbeitung in einer Anwendung, scrollen eine Nachrichtenschleife einzubetten in eine der Funktionen. Diese Meldungsschleife entspricht Hauptnachrichtenschleife MFC, gefunden CWinThread::Run sehr ähnlich. Das bedeutet, dass einer solchen Schleife in einer Anwendung, die mit MFC entwickelten, viele der gleichen Aufgaben wie der Hauptnachrichtenschleife ausführen muss. Das folgende Codefragment veranschaulicht das Schreiben eine Nachrichtenschleife, die mit MFC ist kompatibel:

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, eingebettet in einer Funktion, Schleifen, solange die Leerlaufverarbeitung gibt, auszuführen. Innerhalb dieser Schleife ruft eine geschachtelte Schleife wiederholt PeekMessage auf. Solange dies Aufruf gibt einen Wert ungleich 0 (null), die CWinThread::PumpMessage - Schleife aufruft, um die normale Meldungsübersetzung und -c$weiterleiten auszuführen. Obwohl PumpMessage nicht dokumentiert ist, können Sie den Quellcode in der Datei ThrdCore.Cpp im Verzeichnis \atlmfc\src\mfc in der Visual C++-Installation überprüfen.

Sobald beendet die innere Schleife, die äußeren Schleife ausführt Leerlaufverarbeitung mit einem oder mehreren Aufrufen von OnIdle. Der erste Aufruf ist zu Zwecken MFC. Sie können zusätzliche Aufrufe eigene Hintergrundarbeit erledigen lassen OnIdle.

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

Siehe auch

Konzepte

Allgemeine MFC-Themen