Multithreading: Erstellen von Benutzeroberflächenthreads

Aktualisiert: November 2007

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

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 Meldungen, bevor diese an TranslateMessage und DispatchMessage gesendet werden. 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 für Benutzeroberflächenthreads und eine für Arbeitsthreads. Rufen Sie AfxBeginThread zum Starten des Benutzeroberflächenthreads auf, und geben Sie folgende Informationen an:

  • Die RUNTIME_CLASS der Klasse, die Sie von CWinThread abgeleitet haben.

  • (Optional) Die gewünschte Prioritätsebene Standardmäß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 soll Standardmäßig ist 0 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 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.

Worüber möchten Sie mehr erfahren?

Siehe auch

Konzepte

Multithreading mit C++ und MFC