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 CWinThreadder 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.

Worüber möchten Sie mehr erfahren?

Siehe auch

Multithreading mit C++ und MFC