AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TThread synchronize und Hauptthread

TThread synchronize und Hauptthread

Ein Thema von noisy_master · begonnen am 8. Jun 2021 · letzter Beitrag vom 8. Jun 2021
Antwort Antwort
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
217 Beiträge
 
Delphi XE5 Professional
 
#1

TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 13:56
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
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.436 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 14:30
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.196 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 14:30
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
217 Beiträge
 
Delphi XE5 Professional
 
#4

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 15:57
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"?
Dirk
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
185 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 16:07
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
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
217 Beiträge
 
Delphi XE5 Professional
 
#6

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 16:29
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!
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.196 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 17:10
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.436 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TThread synchronize und Hauptthread

  Alt 8. Jun 2021, 17:31
"Entsprechend sollte man das - insbesondere bei der Verwendung von Threads besser unbedingt vermeiden."
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 10:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf