![]() |
Restlaufzeit bei Delay Anzeigen
Hallo zusammen,
ich möchte gerne die Restlaufzeit von Delay Anzeigen lassen. Die Grund Procedure habe ich aus der Codelibary:
Delphi-Quellcode:
Problem:
procedure Delay(Milliseconds: Integer);
var Tick: DWord; Event: THandle; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWord(Milliseconds); while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin Application.ProcessMessages; if Application.Terminated then Exit; Milliseconds := Tick - GetTickcount; Form1.Label1.Caption:=milliseconds.ToString; Form1.Label1.update; end; finally CloseHandle(Event); end; end; Das Label Aktualisiert sich nur, wenn die Maus bewegt wird, ansonsten bleibt es stehen bzw. ändert sich nur sporadisch. Welche Alternative habe ich dazu? Danke und Gruß Torsten |
AW: Restlaufzeit bei Delay Anzeigen
Zitat:
Wenn es denn unbedingt sein muss: warte nicht die volle von "milliseconds" definierte Zeit sondern halt nur 100 msecs. Dadurch kehrt MsgWait... regelmäßig zurück auch wenn keine Message in der Queue ist. Natürlich mußt Du dann die while-Bedingung anpassen. |
AW: Restlaufzeit bei Delay Anzeigen
Sicher, dass dieses "DING" überhaupt wartet und nicht einfach nur zu 100% den Hauptthread auslastet?
|
AW: Restlaufzeit bei Delay Anzeigen
Zitat:
Er müsste aber trotzdem das label aktualisieren oder? Schließlich müsste ja die Paint-Message irgendwann von der Queue genommen werden. |
AW: Restlaufzeit bei Delay Anzeigen
Zitat:
Delphi-Quellcode:
Es geht jetzt nur darum während Schleifen im Hauptthread Die Anzeige zu aktualisieren.
label1.tag := label1.tag +1; // GetTickcount löst nicht in Milisekunden auf also einfach in Schleifen durchläufe auflösen. Einfach weil ich es mag.
label1.caption := label1.tag.tostring; label1.invalidate; //könnte sein ,dass das besser ist als update label1.refresh; //könnte sein ,dass das besser ist als update Form1.invalidate; //Da label evtl ein TGraphicControl istmacht es vielleicht mehr her wenn man ein übergeordnetes TWincontrol invalidiert. Application.Processmessages; //hier werden die Änderung auch gezeichnet! Aus Threads heraus musst du die Aktualisierung innerhalb von TThread.Synchronize ausführen, wenn du sie erzwingen willst...das würde aber den vorteil von Threads zunichte machen! Oder Du verwendest TThread.Queue oder TThread.ForceQueue . Dann würde die Aktualisierung(oder anderer code) irgendwann, wenn der Hauptthread dran ist, durchgeführt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 Uhr. |
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