AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Restlaufzeit bei Delay Anzeigen

Ein Thema von Metschu · begonnen am 26. Nov 2023 · letzter Beitrag vom 27. Nov 2023
Antwort Antwort
Metschu

Registriert seit: 31. Dez 2006
151 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Restlaufzeit bei Delay Anzeigen

  Alt 26. Nov 2023, 13:04
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
Torsten
Ich kam, sah und alles Funktionierte.
Dann klingelte mein Wecker...
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#2

AW: Restlaufzeit bei Delay Anzeigen

  Alt 26. Nov 2023, 15:00
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.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Restlaufzeit bei Delay Anzeigen

  Alt 26. Nov 2023, 15:08
Sicher, dass dieses "DING" überhaupt wartet und nicht einfach nur zu 100% den Hauptthread auslastet?
$2B or not $2B
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#4

AW: Restlaufzeit bei Delay Anzeigen

  Alt 27. Nov 2023, 12:08
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

AW: Restlaufzeit bei Delay Anzeigen

  Alt 27. Nov 2023, 12:28
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.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (27. Nov 2023 um 12:31 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 17:35 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