Thread-Objekte definieren
Nach oben zu Thread-Objekte definieren - Index
In den meisten Anwendungen wird ein Ausführungs-Thread durch ein Thread-Objekt repräsentiert. Solche Objekte vereinfachen die Entwicklung von Multithread-Anwendungen, indem sie die gängigsten Einsatzmöglichkeiten von Threads kapseln.
Anmerkung: Thread-Objekte bieten keine Kontrolle über die Sicherheitsattribute oder die Stack-Größe der Threads. Um auf diese Faktoren Einfluss zu nehmen, verwenden Sie die Funktion BeginThread. Einige der unter Threads koordinieren beschriebenen Objekte und Methoden zur Thread-Synchronisierung können zusammen mit BeginThread eingesetzt werden.
So verwenden Sie ein Thread-Objekt in Ihrer Anwendung (und einen Nachkommen von Classes.TThread erzeugen):
- Wählen Sie im Hauptmenü einen der Befehle:
- Datei > Neu > Weitere > Delphi-Projekte > Delphi-Dateien > Thread-Objekt
- Datei > Neu > Weitere > C++-Projekte > C++-Dateien > Thread-Objekt
- Im Dialogfeld Neues Thread-Objekt geben Sie einen Klassennamen ein, wie beispielweise TMyThread.
- Um den neuen Thread zu benennen, markieren Sie das Kontrollfeld Benannter Thread und geben einen Thread-Namen ein (nur VCL-Anwendungen).
- Klicken Sie auf OK. Im Quelltext-Editor wird eine neue Unit-Datei erstellt, um den Thread zu implementieren.
Nähere Informationen zur Benennung von Threads finden Sie unter Einen Thread benennen.
Anmerkung: Im Gegensatz zu den meisten Dialogfeldern der IDE, in denen die Eingabe eines Klassennamens erforderlich ist, wird im Dialogfeld Neues Thread-Objekt dem eingegebenen Klassennamen nicht automatisch der Buchstabe T vorangestellt.
Ausgabe
Die automatisch generierte Unit-Datei, die im Quelltext-Editor geöffnet wird, enthält das Quelltextgerüst für die neue Thread-Klasse. Für einen Thread mit dem Namen TMyThread sieht die Datei beispielsweise folgendermaßen aus:
unit Unit1; interface uses Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF}; type TMyTheadClass = class(TThread) protected procedure Execute; override; end; implementation { Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten können nur in Methoden verwendet werden, die mit Synchronize aufgerufen wurden, z.B.: Synchronize(UpdateCaption); und UpdateCaption könnte folgendermaßen aussehen: procedure TMyTheadClass.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; oder Synchronize( procedure begin Form1.Caption := 'Im Thread über eine anonyme Methode aktualisiert' end ) ); wobei eine anonyme Methode übergeben wird. Entsprechend kann der Entwickler die Methode Queue mit den gleichen Parametern wie oben anstatt eine andere TThread-Klasse als ersten Parameter zu übergeben, und den aufrufenden Thread in eine Warteschlange mit dem anderen Thread zu stellen. } { TMyTheadClass } procedure TMyTheadClass.Execute; begin NameThreadForDebugging(mythreadname'); { Thread-Code hier einfügen } end; end.
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten in der VCL können nur // in Methoden verwendet werden, die mit Synchronize aufgerufen wurden, z.B.: // // Synchronize(&UpdateCaption); // // wobei UpdateCaption ao aussehen könnte: // // void __fastcall TMyThreadClass::UpdateCaption() // { // Form1->Caption = "Im Thread aktualisiert"; // } //--------------------------------------------------------------------------- __fastcall TMyThreadClass::TMyThreadClass(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall TMyThreadClass::Execute() { NameThreadForDebugging("mythreadname"); //---- Fügen Sie den Thread-Code hier ein ---- } //---------------------------------------------------------------------------
Nächste Schritte
Die automatisch generierte Unit-Datei bearbeiten Sie folgendermaßen:
- Sie initialisieren ein Thread (optional).
- Sie schreiben die Thread-Funktion. Dazu wird der Quelltext der Methode Execute eingefügt.
- Sie schreiben Clean-up-Quelltext (optional).