Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Thread Synchronize Fragen (https://www.delphipraxis.net/193263-thread-synchronize-fragen.html)

Glados 12. Jul 2017 21:42

AW: Thread Synchronize Fragen
 
Blub :lol: (siehe Seite 3)

Uwe Raabe 12. Jul 2017 22:40

AW: Thread Synchronize Fragen
 
Zitat:

Zitat von Glados (Beitrag 1376542)
Geht das nicht besser als mit
Delphi-Quellcode:
WM_USER + N;
?

Wenn du bei
Delphi-Quellcode:
PostMessage
bleiben willst, nein. Ich würde
Delphi-Quellcode:
TThread.Queue
verwenden. Das ist wesentlich besser lesbar und deutlich flexibler.

Glados 13. Jul 2017 11:00

AW: Thread Synchronize Fragen
 
Zitat:

Wenn du bei PostMessage bleiben willst, nein. Ich würde TThread.Queue verwenden. Das ist wesentlich besser lesbar und deutlich flexibler.
Aber synchronisiert Queue nicht auch irgendwo wieder das Hauptformular komplett?

Es ist besser lesbar und dafür gibt es 100 Punkte mehr als für PostMessage. Aber PostMessage, muss man leider sagen, ist wesentlich performanter wenn man das mehrere Tausend mal in 20 Sekunden ausführt.

Uwe Raabe 13. Jul 2017 12:45

AW: Thread Synchronize Fragen
 
Zitat:

Zitat von Glados (Beitrag 1376632)
Aber synchronisiert Queue nicht auch irgendwo wieder das Hauptformular komplett?

Was meinst du damit? Natürlich wird die Queue-Proc im Hauptthread aufgerufen, genau wie auch bei Synchronize. Der Unterschied ist, daß Synchronize wartet bis dies geschehen ist und Queue eben nicht.

Zitat:

Zitat von Glados (Beitrag 1376632)
Es ist besser lesbar und dafür gibt es 100 Punkte mehr als für PostMessage. Aber PostMessage, muss man leider sagen, ist wesentlich performanter wenn man das mehrere Tausend mal in 20 Sekunden ausführt.

Das mit der Performance kann ich ohne konkreten Anwendungsfall nicht beurteilen. Der Ablauf mit Queue ist aber im Prinzip folgender:

Die auszuführende Prozedur wird per Queue in eine Liste geschrieben. Dann wird der Hauptthread aufgeweckt indem ihm per PostMessage (sieh mal an!) ein WM_NULL geschickt wird. In der Application.WndProc wird diese Message dann mit einem CheckSynchronize verarbeitet. Das CheckSynchronize arbeitet dann alle aktuell in der Liste stehenden Queue-Procs ab. Gegenüber einer reinen PostMessage-Lösung könnte sich hier eigentlich nur die Verwaltung der Liste auf die Performance auswirken.

jaenicke 13. Jul 2017 18:10

AW: Thread Synchronize Fragen
 
Zitat:

Zitat von Glados (Beitrag 1376632)
Es ist besser lesbar und dafür gibt es 100 Punkte mehr als für PostMessage. Aber PostMessage, muss man leider sagen, ist wesentlich performanter wenn man das mehrere Tausend mal in 20 Sekunden ausführt.

Wir haben zufällig vor einiger Zeit eine alte Message-basierte Lösung auf TThread.Queue umgestellt.
Der Quelltext ist dadurch sehr viel kürzer und übersichtlicher geworden und wurde von der Performance her tendentiell eher etwas schneller. Einen großen eindeutig messbaren Unterschied gab es jedenfalls nicht und damit gewinnt der bessere Code.

Glados 13. Jul 2017 20:14

AW: Thread Synchronize Fragen
 
Zitat:

Das mit der Performance kann ich ohne konkreten Anwendungsfall nicht beurteilen.
Beispiel 1: gegeben ist ein Thread welcher sich alle 25ms die Position einer ProgressBar holt.
Beispiel 2: gegeben ist ein Thread der alle 25ms die Position einer ProgressBar setzt.

Gerade bei Beispiel 2 konnte ich große Unterschiede bzgl eines ruckelfreien Hauptformulars feststellen.

himitsu 13. Jul 2017 20:18

AW: Thread Synchronize Fragen
 
Beispiel 3: der Thread ist schlau genug und muß das nicht alle 25ms tun

Glados 13. Jul 2017 20:19

AW: Thread Synchronize Fragen
 
Mein Thread ist schlau genug :P er prüft vorher, ob sich die ProgressBar überhaupt bewegt hat :P ob es überhaupt etwas zu ändern gibt, indem ein paar Daten abgeglichen werden.

Zusätzlich habe noch so etwas drin
Delphi-Quellcode:
if (System.DateUtils.MilliSecondsBetween(Now, iCurrentTime) >= 500) then
 begin
  // hier jetzt prüfen, ob ProgressBar überhaupt gesetzt werden muss
 
  iCurrentTime := Now;
 end;
Ich komme jedenfalls gut klar mit den PostMessages. Ich finde es nun sauberer und perfomanter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 4 von 4   « Erste     234   

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