Thema: Delphi TThread.Synchronize

Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TThread.Synchronize

  Alt 14. Mär 2013, 18:03
Delphi-Version: XE2
Hallo-

Ich weiß dass schätzungsweise 20% des weltweiten Internet-Traffics von Fragen zu Delphi-Threads und Synchronize() verursacht werden, trotzdem finde ich nicht wirklich eine Antwort:

Überall sprechen die Leute nur davon, von einem Thread aus etwas im Kontext des Haupt-Threads auszuführen. Praktisch immer um ein VCL-Element zu aktualisieren. Ich möchte aber vom Hauptthread aus eine Methode im Kontext meines TThread-Objekts aufrufen. Besser noch: Eine lokale Variable auf dem Stack eines Threads A mit Werten füllen die ein Thread B in Erfahrung bringt.

In den letzten Tagen wusste ich noch nicht einmal, dass es ein Delphi TThread-Objekt gibt. Bislang bin ich immer direkt den Weg über die WinAPI mittels CreateThread/BeginThread und kritischen Abschnitten gegangen. Jetzt dachte ich, TThread sei unheimlich komfortabel.

Ich dachte, ich kann es einfach folgendermaßen über die Bühne bringen:
Delphi-Quellcode:
TThread.Synchronize(
   meinThread,
   procedure
   begin
      lokaleVariable := getWert();
   end
);
Das klappt nicht wirklich. Oder zumindest nicht, wie ich mir das vorgestellt habe: Mit diesem Aufruf ist anscheinend keineswegs sichergestellt, dass sich meinThread nicht auch grade durch getWert() wühlt, der darin dann unterbrochen wird, und anschließend der Kram noch einmal obendrauf ausgeführt wird? Denn danach sieht es mir aus...
Spontan hätte ich jetzt erwartet, dass TThread.Synchronize(meinThread, ...) erst einmal so lange blockiert, bis meinThread sich schlafen gelegt hat oder wenigstens nicht selbst gerade mittendrin in getWert() steckt!

Habe ich durch TThread überhaupt etwas gewonnen? Oder muss ich trotzdem wieder auf kritische Abschnitte und Pipes zurückgreifen?

Geändert von Der schöne Günther (14. Mär 2013 um 19:22 Uhr) Grund: Im Vollrausch geschriebene Sätze neu formuliert
  Mit Zitat antworten Zitat