Haupt-VCL-Thread benutzen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu So erstellen Sie Multithread-Anwendungen

Die Verwendung des Haupt-VCL-Threads erfordert drei grundlegende Schritte:

  1. Eine eigene Routine zur Behandlung von Windows-Botschaften erstellen, die von Komponenten der Anwendung empfangen werden.
  2. In regelmäßigen Abständen CheckSynchronize aufrufen.
  3. Bei Bedarf thread-lokale Variablen deklarieren, die ausschließlich dem Thread zur Verfügung stehen.

So erstellen Sie eine separate Routine:

  1. Schreiben Sie eine Haupt-Thread-Routine, die Zugriffe auf Objekteigenschaften und die Ausführung von Objektmethoden für alle Objekte der Anwendung handhabt.
  2. Rufen Sie die Routine mit der Methode TThread.Synchronize (Delphi) bzw. TThread::Synchronize (C++) auf. Der folgende Code zeigt ein Beispiel für den Aufruf einer Methode mit Synchronize:
procedure TMyThread.PushTheButton 
begin 
  Button1.Click; 
end; 
procedure TMyThread.Execute; 
begin 
  ... 
  Synchronize(PushThebutton); 
  ... 
end; 
void TMyThread::PushTheButton() 
 { 
  Form1->Button1->Click(); 
 } 
void __fastcall TMyThread::Execute() 
 { 
  ... 
  Synchronize( (TThreadMethod)&PushTheButton ); 
  ... 
 }

Synchronize wartet, bis der Haupt-Thread in die Botschaftsschleife eintritt, und führt dann die übergebene Methode aus.

Hinweis: Da die Methode Synchronize eine Botschaftsschleife verwendet, kann sie nicht in Konsolenanwendungen eingesetzt werden. Für Konsolenanwendungen müssen Sie einen anderen Mechanismus benutzen, z.B. kritische Abschnitte, um den Zugriff auf VCL-Objekte zu schützen.

So rufen Sie CheckSynchronize auf:

  1. Rufen Sie CheckSynchronize im Haupt-Thread regelmäßig auf, damit Hintergrund-Threads ihre Ausführung mit dem Haupt-Thread synchronisieren können.
  2. Um die Sicherheit der an Hintergrund-Threads gerichteten Aufrufe zu gewährleisten, rufen Sie CheckSynchronize auf, wenn die Anwendung inaktiv ist, beispielsweise aus einer Ereignisbehandlungsroutine für OnIdle.

So verwenden Sie eine thread-lokale Variable:

  1. Ermitteln Sie die Variablen, die für alle im Thread ausgeführten Routinen global verfügbar, jedoch für andere Instanzen der gleichen Thread-Klasse nicht sichtbar sein sollen.
  2. In Delphi deklarieren Sie diese Variablen in einem threadvar-Abschnitt. Beispiel:
threadvar 
  x: integer;

In C++ deklarieren Sie diese Variablen mit dem Modifizierer __thread:

int __thread x;

Hinweis: Verwenden Sie den Abschnitt threadvar nur für globale Variablen. Verwenden Sie ihn nicht für Zeiger- oder Funktionsvariablen oder für Typen, deren Wert beim Schreiben kopiert wird, wie beispielsweise lange Strings.

Hinweis: In C++ muss eine __thread-Variable mit einem konstanten Ausdruck initialisiert werden. So ist z.B. int __thread foo = 3; eine gültige Anweisung. Dagegen ist int __thread foo = get_value(); nicht zulässig, da die Initialisierung zur Laufzeit erfolgt.

Siehe auch