Multithreading mit C++ und MFC
Die MFC-Bibliothek (Microsoft Foundation Class) bietet Unterstützung für Multithreadanwendungen. In diesem Thema werden Prozesse und Threads sowie das MFC-Multithreading beschrieben.
Ein Prozess ist eine ausführende Instanz einer Anwendung. Wenn Sie z. B. auf das Symbol von Editor doppelklicken, starten Sie einen Prozess, der Editor ausführt.
Ein Thread ist ein Ausführungspfad innerhalb eines Prozesses. Wenn Sie Editor starten, erstellt das Betriebssystem einen Prozess und beginnt mit der Ausführung des primären Threads dieses Prozesses. Bei Beendung des Threads wird auch der Prozess beendet. Dieser primäre Thread wird dem Betriebssystem durch den Startcode in Form einer Funktionsadresse zur Verfügung gestellt. In der Regel handelt es sich um die Adresse oder Funktion, die main
WinMain
angegeben wird.
Bei Bedarf können Sie in einer Anwendung zusätzliche Threads erstellen. Dies bietet sich z. B. zur Verarbeitung von Hintergrund- oder Verwaltungsaufgaben an. Auf diese Weise muss der Benutzer nicht auf deren Beendung warten. Alle Threads in MFC-Anwendungen werden durch CWinThread-Objekte dargestellt. In den meisten Fällen müssen Sie diese Objekte nicht einmal explizit erstellen. Rufen Sie stattdessen die Framework-Hilfsfunktion AfxBeginThread auf, die das CWinThread
Objekt für Sie erstellt.
In MFC werden zwei Threadtypen unterschieden: Benutzeroberflächenthreads und Arbeitsthreads. Benutzeroberflächenthreads werden normalerweise verwendet, um Benutzereingaben zu behandeln und um auf vom Benutzer generierte Ereignisse und Meldungen zu reagieren. Arbeitsthreads werden normalerweise verwendet, um Aufgaben durchzuführen, für die keine Benutzereingaben erforderlich sind (z. B. Neuberechnungen). In der Win32-API findet keine Unterscheidung zwischen Threadtypen statt; es muss lediglich die Startadresse des Threads bekannt sein, damit mit dessen Ausführung begonnen werden kann. In MFC wird ein spezielles Verfahren zur Behandlung von Benutzeroberflächenthreads verwendet: es wird eine Meldungsverteilschleife für Ereignisse in der Benutzeroberfläche zur Verfügung gestellt. CWinApp
ist ein Beispiel für ein Benutzeroberflächenthread-Objekt, da es von CWinThread
abgeleitet ist und Ereignisse und Meldungen behandelt, die vom Benutzer generiert wurden.
In Fällen, in denen mehrere Threads auf dasselbe Objekt zugreifen müssen, sollten Sie besondere Vorsicht walten lassen. Multithreading: Programmiertipps beschreiben Techniken, mit denen Sie Probleme umgehen können, die in diesen Situationen auftreten können. Multithreading: Verwendung der Synchronisierungsklassen beschreibt, wie Sie die Klassen verwenden, die zum Synchronisieren des Zugriffs von mehreren Threads zu einem einzelnen Objekt verfügbar sind.
Das Schreiben und Debuggen von Multithreadprogrammen ist naturgemäß ein komplexes und schwieriges Unterfangen, da Sie sicherstellen müssen, dass nur jeweils ein Thread auf die Objekte zugreift. In den Themen zu Multithreading werden keine Grundlagen der Multithreadprogrammierung vermittelt. Sie erfahren lediglich, wie MFC in einem Multithreadprogramm verwendet werden kann. In den in Visual C++ enthaltenen MFC-Multithreadbeispielen werden einige Möglichkeiten zum Hinzufügen weiterer Multithreadfunktionen sowie einige Win32-APIs erläutert, die in MFC nicht enthalten sind. Sie sollten diese jedoch lediglich als Ausgangspunkt betrachten.
Weitere Informationen dazu, wie das Betriebssystem Prozesse und Threads verarbeitet, finden Sie unter "Prozesse und Threads " im Windows SDK.
Weitere Informationen zur Multithreadunterstützung in MFC finden Sie in folgenden Themen:
Multithreading: Verwendungsweise der Synchronisierungsklassen
Multithreading: Verwendungsmöglichkeiten der Synchronisierungsklassen