Multithreading: Erstellen von Benutzeroberflächenthreads
Ein Benutzeroberflächenthread wird normalerweise verwendet, um unabhängig von Threads, die derzeit andere Teile der Anwendung ausführen, Benutzereingaben zu behandeln und um auf vom Benutzer generierte Ereignisse zu reagieren.Der Thread der Hauptanwendung, der in der von CWinApp abgeleiteten Klasse enthalten ist, ist bereits erstellt und wird automatisch gestartet.In diesem Thema werden die notwendigen Schritte zur Erstellung zusätzlicher Benutzeroberflächenthreads beschrieben.
Der erste Schritt bei der Erstellung eines Benutzeroberflächenthreads ist die Ableitung einer Klasse von CWinThread.Sie müssen diese Klasse mit dem DECLARE_DYNCREATE-Makro und dem IMPLEMENT_DYNCREATE-Makro deklarieren und implementieren.Die Klasse muss bestimmte Funktionen überschreiben und kann wiederum andere Funktionen überschreiben.Diese Funktionen und ihre Aufgaben werden in der folgenden Tabelle erläutert.
Zu überschreibende Funktionen bei der Erstellung eines Benutzeroberflächenthreads
Funktion |
Zweck |
---|---|
Führt Aufräumarbeiten durch, wenn der Thread beendet wird.Wird normalerweise überschrieben. |
|
Führt die Instanzeninitialisierung des Threads durch.Muss überschrieben werden. |
|
Führt die threadspezifische Leerlaufzeitverarbeitung durch.Wird normalerweise nicht überschrieben. |
|
Filtert Meldungen, bevor diese an TranslateMessage und DispatchMessage gesendet werden.Wird normalerweise nicht überschrieben. |
|
Fängt unbehandelte Ausnahmen ab, die von den Meldungs- und Befehlshandlern des Threads ausgelöst werden.Wird normalerweise nicht überschrieben. |
|
Steuerungsfunktion für den Thread.Enthält die Meldungsverteilschleife.Wird selten überschrieben. |
MFC stellt zwei Versionen von AfxBeginThread durch Parameterüberladen bereit: ein, das nur Arbeitsthreads erstellen kann und eines, das Benutzeroberflächenthreads oder Arbeitsthreads erstellen kann.Um den Benutzeroberflächenthread zu starten, rufen Sie die zweite Überladung von AfxBeginThread auf und die folgenden Informationen bereitstellen:
Die RUNTIME_CLASS der Klasse, die Sie von CWinThread abgeleitet haben.
(Optional) Die gewünschte PrioritätsebeneStandardmäßig ist normale Priorität eingestellt.Weitere Informationen zu den verfügbaren Prioritätsebenen finden Sie im Windows SDK unter SetThreadPriority.
(Optional) Die gewünschte Stapelgröße für den Thread.Standardmäßig wird die Größe des Erstellungsthreads verwendet.
(Optional) CREATE_SUSPENDED, wenn der Thread im unterbrochenen Zustand generiert werden sollStandardmäßig ist 0 eingestellt; Sie können den Thread auch normal starten.
(Optional) Die gewünschten SicherheitsattributeStandardmäßig werden dieselben Zugriffsrechte wie für den übergeordneten Thread verwendet.Weitere Informationen zum Format dieser Sicherheitsinformationen finden Sie im Windows SDK unter SECURITY_ATTRIBUTES.
Von AfxBeginThread wird der Großteil der Arbeit für Sie übernommen:Nach der Erstellung eines neuen Objekts einer Klasse wird es mit den von Ihnen zur Verfügung gestellten Informationen initialisiert; anschließend wird CWinThread::CreateThread aufgerufen, um mit der Ausführung des Threads zu beginnen.Während der gesamten Prozedur wird überprüft, ob alle Objekte ordnungsgemäß freigegeben werden, falls ein Teil des Erstellungsprozesses fehlschlagen sollte.