Multithreading: Erstellen von MFC-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.
Als Erstes müssen Sie beim Erstellen eines Benutzeroberflächenthreads eine Klasse von CWinThread ableiten. Sie müssen diese Klasse mit den Makros DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE 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 |
---|---|
ExitInstance | Führt Aufräumarbeiten durch, wenn der Thread beendet wird. Wird normalerweise überschrieben. |
Initinstance | Führt die Instanzeninitialisierung des Threads durch. Muss überschrieben werden. |
OnIdle | Führt die threadspezifische Leerlaufzeitverarbeitung durch. Wird normalerweise nicht überschrieben. |
PreTranslateMessage | Filtert Nachrichten, bevor sie an TranslateMessage und DispatchMessage . Wird normalerweise nicht überschrieben. |
ProcessWndProcException | Fängt unbehandelte Ausnahmen ab, die von den Meldungs- und Befehlshandlern des Threads ausgelöst werden. Wird normalerweise nicht überschrieben. |
Run | Steuerungsfunktion für den Thread. Enthält die Meldungsverteilschleife. Wird selten überschrieben. |
in MFC werden durch Parameterüberladung zwei Versionen von AfxBeginThread
zur Verfügung gestellt: eine, die nur Arbeitsthreads erstellen kann, und eine, die Benutzeroberflächenthreads oder Arbeitsthreads erstellen kann. Rufen Sie zum Starten des Benutzeroberflächenthreads die zweite Überladung von AfxBeginThread auf, und geben Sie die folgenden Informationen an:
Die RUNTIME_CLASS der Klasse, von
CWinThread
der Sie abgeleitet sind.(Optional) Die gewünschte Prioritätsebene Standardmäßig ist normale Priorität eingestellt. Weitere Informationen zu den verfügbaren Prioritätsstufen finden Sie unter SetThreadPriority im Windows SDK.
(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 in einem angehaltenen Zustand erstellt werden soll. Standardmäßig ist null0null eingestellt; Sie können den Thread auch normal starten.
(Optional) Die gewünschten Sicherheitsattribute Standardmäßig werden dieselben Zugriffsrechte wie für den übergeordneten Thread verwendet. Weitere Informationen zum Format dieser Sicherheitsinformationen finden Sie unter SECURITY_ATTRIBUTES im Windows SDK.
Von AfxBeginThread
wird der Großteil der Arbeit für Sie übernommen: Es erstellt ein neues Objekt Ihrer Klasse, initialisiert es mit den von Ihnen bereitgestellten Informationen und ruft CWinThread::CreateThread auf, 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.