Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TThread synchronize und Hauptthread (https://www.delphipraxis.net/208093-tthread-synchronize-und-hauptthread.html)

noisy_master 8. Jun 2021 12:56

TThread synchronize und Hauptthread
 
Hallo Gemeinde,

ich beschäftige mich gerade etwas mit Threads und mir ist da eine Frage eingefallen, zu der ich bisher in Gooxxx keine Antwort gefunden habe:

Angenommen mein Hauptthread hat ein Formular mit einem Label und eine procedure dieses Label zu aktualisieren (updateLabel). In meinem Formular wird ein weiterer Thread erzeugt, der irgendwelche Berechnungen ausführt und ab und an das Label des Formulars aktualisieren soll. Dazu muss ja im Thread ein synchronize(updateLabel) aufgerufen werden.
Kann der Hauptthread diese Methode(updateLabel) gefahrlos parallel aufrufen, oder muss ich die dann noch über z.B. CriticalSections absichern?

Danke schon mal vorab

Uwe Raabe 8. Jun 2021 13:30

AW: TThread synchronize und Hauptthread
 
Das Synchronize sorgt dafür, dass die übergebene Methode im Hauptthread ausgeführt wird. Man braucht (und sollte) dann nicht noch zusätzlich etwas machen.

stahli 8. Jun 2021 13:30

AW: TThread synchronize und Hauptthread
 
In dem Moment, wenn Du Synchronize(MainForm.UpdateLabel) aufrufst, wird der Mainthread unterbrochen.
(Ist technisch gesehen nicht ganz korrekt, aber so kann man es vereinfacht sehen.)

Wenn Du also z.B. UpdateLabel auch von einem Timer aus aufrufst, werden sich beine Aufrufe nicht in die Quere kommen.

noisy_master 8. Jun 2021 14:57

AW: TThread synchronize und Hauptthread
 
Zitat:

Zitat von stahli (Beitrag 1490839)
In dem Moment, wenn Du Synchronize(MainForm.UpdateLabel) aufrufst, wird der Mainthread unterbrochen.
(Ist technisch gesehen nicht ganz korrekt, aber so kann man es vereinfacht sehen.)

Wenn Du also z.B. UpdateLabel auch von einem Timer aus aufrufst, werden sich beine Aufrufe nicht in die Quere kommen.

Danke schonmal....ABER: was passiert wenn man die Methode nicht aus einem Timer aufruft, oder noch schlimmer "schon in der Methode" ist, wenn man vom Thread unterbrochen wird und der dann die Methode im "synchronize aufruft"?

jziersch 8. Jun 2021 15:07

AW: TThread synchronize und Hauptthread
 
Synchronize verwendet windows messages, daher ist man immer in der Ebene der Tastatureingaben, Timer und anderen Ereignisse.

Ich würde eher auf Synchronize verzichten und stattdessen das Label periodisch updaten.

Man kann entweder ein PostMessage im Thread verwenden oder einen Timer um dem Programm mitzuteilen, dass es updaten soll.

Die Daten für das Label müssen natürlich geschützt sein mit TMonitor.Enter/Exit

noisy_master 8. Jun 2021 15:29

AW: TThread synchronize und Hauptthread
 
Zitat:

Zitat von jziersch (Beitrag 1490846)
Synchronize verwendet windows messages, daher ist man immer in der Ebene der Tastatureingaben, Timer und anderen Ereignisse.

Ah, das war der entscheidende Hinweis.. wenn man also schon "in der Methode ist" und der thread "dazwischenkommt" und wieder "zurückkehrt, wird erst der "Rest abgearbeitet", die Message vom "synchronize abgeholt" und weiter geht es... JETZT ist es klar!!!

VIELEN DANK!

stahli 8. Jun 2021 16:10

AW: TThread synchronize und Hauptthread
 
Genau.

Application.ProcessMessages drängelt sich aber bei der Bearbeitungsreihenfolge dazwischen.
Also wenn man dieses einsetzt kann es durchaus Probleme geben.
Entsprechend sollte man das - insbesondere bei der Verwendung von Threads besser vermeiden.

Uwe Raabe 8. Jun 2021 16:31

AW: TThread synchronize und Hauptthread
 
"Entsprechend sollte man das - insbesondere bei der Verwendung von Threads besser unbedingt vermeiden."


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz