Home » Tutorials » Object Pascal/RTL » Threads

Threads

TThread

Bisher haben wir nur über Funktionen aus dem Win32-API gesprochen. Aber Delphi wäre nicht Delphi, wenn es hierfür keine Vereinfachung bieten würde. So enthält die VCL eine Klasse TThread. Wir werden uns nun anschauen, wie man diese nutzen kann. Eine Vereinfachung bringt natürlich auch mit sich, dass man nicht so viele Vorgaben (mittels Parameter) machen kann. In den meisten Fällen dürfte TThread jedoch ausreichend sein.
Wichtig zu wissen ist, dass man nicht einfach eine Instanz von TThread erzeugen und verwenden kann. Man muss zunächst eine neue Klasse von TThread ableiten und an seine Anforderungen anpassen. Wenn Sie über Datei/Neu/Thread-Objekt eine Unterklasse zu TThread erzeugen, besitzt diese folgende Deklaration:

MyThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  end;

Um der Objektorientierung gerecht zu werden, sollten Sie dieser Klasse im private-Teil alle Objektfelder hinzufügen, auf die der Thread Zugriff haben soll. Desweiteren sollte der Konstruktor überschrieben werden (im zu ergänzenden Abschnitt public) und die Objektfelder initialisieren. Außerdem fehlt die Funktion, die vom Thread durchlaufen werden soll (entsprechend der Funktion UnserThread, wenn Sie sich an die Konsolenanwendung in einem früheren Abschnitt erinnern).
Unbedingt überschrieben werden muss die Methode Execute. Genau genommen steht hierin der Thread-Code. Eine zusätzliche Funktion erhöht jedoch die Übersichtlichkeit.
In unserem Fall ruft die Methode Execute also nur die Methode UnserThread auf. Ist Execute abgearbeitet, beendet sich der Thread. Dabei wird das Ereignis OnTerminate ausgelöst, auf das Ihr Programm bei Bedarf reagieren kann.
Auf etwas Wichtiges weist der Kommentar in Delphis Code-Gerüst für eine neue Thread-Klasse hin: Methoden und Eigenschaften von Objekten in der VCL können nur in einer Methode namens Synchronize verwendet werden. Synchronize löst den Aufruf einer bestimmten Methode aus, die vom VCL-Haupt-Thread ausgeführt werden soll. Durch dieses indirekte Verfahren werden Konflikte in Multithread-Anwendungen vermieden.