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