Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Restlaufzeit bei Delay Anzeigen (https://www.delphipraxis.net/214163-restlaufzeit-bei-delay-anzeigen.html)

Metschu 26. Nov 2023 12:04

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:
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;
Problem:
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

peterbelow 26. Nov 2023 14:00

AW: Restlaufzeit bei Delay Anzeigen
 
Zitat:

Zitat von Metschu (Beitrag 1530091)
Hallo zusammen,

ich möchte gerne die Restlaufzeit von Delay Anzeigen lassen.

Die Grund Procedure habe ich aus der Codelibary:

Delphi-Quellcode:
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;
Problem:
Das Label Aktualisiert sich nur, wenn die Maus bewegt wird, ansonsten bleibt es stehen bzw. ändert sich nur sporadisch.

Welche Alternative habe ich dazu?

Lass es einfach, delays haben in dem main (UI) thread nichts verloren. Wenn Du glaubst sie zu benötigen deutet das auf einen Fehler im Design hin.

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.

himitsu 26. Nov 2023 14:08

AW: Restlaufzeit bei Delay Anzeigen
 
Sicher, dass dieses "DING" überhaupt wartet und nicht einfach nur zu 100% den Hauptthread auslastet?

QuickAndDirty 27. Nov 2023 11:08

AW: Restlaufzeit bei Delay Anzeigen
 
Zitat:

Zitat von himitsu (Beitrag 1530098)
Sicher, dass dieses "DING" überhaupt wartet und nicht einfach nur zu 100% den Hauptthread auslastet?

Sieht für mich auch so aus.
Er müsste aber trotzdem das label aktualisieren oder? Schließlich müsste ja die Paint-Message irgendwann von der Queue genommen werden.

QuickAndDirty 27. Nov 2023 11:28

AW: Restlaufzeit bei Delay Anzeigen
 
Zitat:

Zitat von Metschu (Beitrag 1530091)
Problem:
Das Label Aktualisiert sich nur, wenn die Maus bewegt wird, ansonsten bleibt es stehen bzw. ändert sich nur sporadisch.

Welche Alternative habe ich dazu?

Wenn es um die Anzeige geht kannst noch mehr ausprobieren
Delphi-Quellcode:
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!
Es geht jetzt nur darum während Schleifen im Hauptthread Die Anzeige zu aktualisieren.
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 19:25 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