Haupt-VCL-Thread benutzen
Nach oben zu So erstellen Sie Multithread-Anwendungen
Die Verwendung des Haupt-VCL-Threads erfordert drei grundlegende Schritte:
- Eine eigene Routine zur Behandlung von Windows-Botschaften erstellen, die von Komponenten der Anwendung empfangen werden.
- In regelmäßigen Abständen CheckSynchronize aufrufen.
- Bei Bedarf thread-lokale Variablen deklarieren, die ausschließlich dem Thread zur Verfügung stehen.
So erstellen Sie eine separate Routine:
- Schreiben Sie eine Haupt-Thread-Routine, die Zugriffe auf Objekteigenschaften und die Ausführung von Objektmethoden für alle Objekte der Anwendung handhabt.
- 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:
- Rufen Sie CheckSynchronize im Haupt-Thread regelmäßig auf, damit Hintergrund-Threads ihre Ausführung mit dem Haupt-Thread synchronisieren können.
- 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:
- 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.
- 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.