AW: Thread mit timer gestartet
Delphi-Quellcode:
im Thread und ich bin ziemlich sicher dass es gehn wird :wink:
while true do
begin Synchronize(LabelSetzen); sleep(10); end; Edit: Ausprobiert - klappt ohne einzufrieren oder sonstige Probleme. |
AW: Thread mit timer gestartet
Na gut ich kenn es anders..
GUI-Elemente dürfen nur im Hauptthread erzeugt und angesprochen werden.. siehe Invoke! Alles andere friert den Hauptthread ein. Aber vielleicht verwechsle ich da auch was.:!: War auch nur ein Vorschlag ob er nun Sleep verwendet oder meinen Vorschlag sei ihm überlassen. Bei mir ist Sleep die allerletzte Entscheidung wenn es nicht mehr anders geht. gruss |
AW: Thread mit timer gestartet
Naja wenn man ohne Synchronize auf die GUI des Hauptthreads zugreift kann es zu Fehlern und ggf. Absturz des Nicht-Hauptthreads führen falls beide Threads plötzlich gleichzeitig auf GUI-Elemente zugreifen. Es friert eigentlich nichts ein. Wäre das sleep(10) nicht im Thread dann würde der Main Thread einfrieren weil Synchronize die entsprechende Methode im MainThread ausführt und das den Thread quasi unnötig machen würde. So führt er das setzen des Labels im MainThread aus, kehrt zurück, wartet 10 MilliSekunden und wiederholt das ganze. Ist also in dem Fall einfach nur eine Art übermäßig komplizierter Timer.
|
AW: Thread mit timer gestartet
Zitat:
Aber du meinst wohl 10ms.. Flüchtigkeitsfehler. :) gruss |
AW: Thread mit timer gestartet
Eh ja genau, habs korrigiert :mrgreen:
|
AW: Thread mit timer gestartet
Zitat:
Ok das musste sein ;) gruss |
AW: Thread mit timer gestartet
Man hätte auch einfach den Code ändern können ;)
Delphi-Quellcode:
sleep(10000);
|
AW: Thread mit timer gestartet
Zitat:
gruss |
AW: Thread mit timer gestartet
Hallo,
Danke für die viele Beiträge. Wenn ich Euere Diskusion richtig verstanden habe, darf man den sleep verwenden wenn man im Thread keine GUI funktionen braucht. Das ist auch bei mir der Fall. Sonst muss man die API funktion benützen, ist noch wichtig das zu wissen ! |
AW: Thread mit timer gestartet
Nicht ganz. Sleep geht immer. Auf die GUI sollte man eigentlich überhaupt nicht aus einem Thread zugreifen, wenn alle Stricke reißen aber bitte dann synchronisiert. Besser aber gar nie und nimmer, das zwingt einen auch gleichzeitig zu einem vernünftig entkoppelten Programmdesign. Ich nutze Sleep() auch sehr viel in Threads, und halte es für eine absolut gängige Methode wenn sichergestellt ist, dass man seinen Thread nicht doch event-gesteuert auch mal zwischen durch beleben möchte. (Wobei ich es auch wieder in die Design-Problem Ecke stellen würde, wenn man EINEN Thread hat, der sowohl zyklisch als auch nach Ereignissen reagieren soll.)
Dass ein Sleep nicht mit in den synchronisierten Abschnitt gehört, sollte eigentlich klar sein. Ansonsten: Schlaf gut! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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