Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Timer läuft ab Mitternacht rückwärts (https://www.delphipraxis.net/186409-timer-laeuft-ab-mitternacht-rueckwaerts.html)

SMO 1. Sep 2015 16:20

AW: Timer läuft ab Mitternacht rückwärts
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1314308)
War das nicht der Grund weshalb Google Chrome über Monate (Jahre?) unter Windows die Laptop-Akkus schneller leergesaugt hat als jeder andere Browser?

Davon habe ich nichts gehört, aber sieht so aus als hättest du Recht. :)

Es stimmt auf jeden Fall, dass ein Erhöhen der Timergenauigkeit, sei es mit timeBeginPeriod oder NtSetTimerResolution, zu einer höheren Systemauslastung und damit zu höherem Energieverbrauch führt, steht auch im MSDN.

Sir Rufo 1. Sep 2015 16:21

AW: Timer läuft ab Mitternacht rückwärts
 
Wozu wird denn ein Timer überhaupt benötigt?

Wenn ich wissen möchte, wieviel Zeit vergangen ist zwischen dem Zeitpunkt x und y, dann berechne ich das einfach. Dazu benötige ich keinen Timer und zum Zeitpunkt der Abfrage ist der Wert zuverlässig genau.
Delphi-Quellcode:
TStopWatch = record
private
  FStartedAt, FStoppedAt: TDateTime;
  FIsStarted: Boolean;
public
  procedure Start;
  procedure Stop;
  function ElapsedTime : Double;
end;

procedure TStopWatch.Start;
begin
  FStartedAt := Now();
  FIsStarted := true;
end;

procedure TStopWatch.Stop;
begin
  FStoppedAt := Now();
  FIsRunning := False;
end;

function TStopWatch.ElapsedTime: Double;
begin
  if FIsRunning then
    Result := Now() - FStartedAt
  else
    Result := FStoppedAt - FStartedAt;
end;

Der schöne Günther 1. Sep 2015 16:25

AW: Timer läuft ab Mitternacht rückwärts
 
Er wollte doch eine live mitlaufende Anzeige auf seinem Formular haben, wie auf dem Display einer echten Stoppuhr auch. Da liegt ein Timer doch nahe.

Sir Rufo 1. Sep 2015 16:28

AW: Timer läuft ab Mitternacht rückwärts
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1314311)
Er wollte doch eine live mitlaufende Anzeige auf seinem Formular haben, wie auf dem Display einer echten Stoppuhr auch. Da liegt ein Timer doch nahe.

Und? Den kann er doch auch für die Aktualisierung des Formulars nehmen - frage die StopWatch und zeige das Ergebnis.

Man zählt über einen Timer aber nicht mit, wieviel Zeit vergangen ist.

Der schöne Günther 1. Sep 2015 16:30

AW: Timer läuft ab Mitternacht rückwärts
 
Ich dachte du wolltest dem armen Kerl mit "Wozu wird denn ein Timer überhaupt benötigt?" ganz die Verwendung von Timern absprechen.

Aber er läuft ja jetzt um Mitternacht nicht mehr rückwärts, scheint ja alles in Ordnung jetzt :stupid:

SMO 1. Sep 2015 16:40

AW: Timer läuft ab Mitternacht rückwärts
 
Zitat:

Zitat von Sir Rufo (Beitrag 1314310)
Wozu wird denn ein Timer überhaupt benötigt?

Wenn ich wissen möchte, wieviel Zeit vergangen ist zwischen dem Zeitpunkt x und y, dann berechne ich das einfach. Dazu benötige ich keinen Timer und zum Zeitpunkt der Abfrage ist der Wert zuverlässig genau.

Schöne Lösung, aber rate mal, welche Auflösung/Genauigkeit sie hat. Richtig, exakt dieselbe wie timeGetTime. D.h. standardmäßig 15,625 ms, es sei denn die globale Timer-Auflösung wurde per timeBeginPeriod / NtSetTimerResolution verändert.

Übrigens: Die RAD Studio IDE setzt die Timer-Auflösung auf 1 ms! Das hat mich beim Debuggen schon mal gebissen. Hatte timeBeginPeriod(1) in meinem Programm vergessen und mich gewundert, warum es nur richtig lief wenn es aus der IDE heraus gestartet wurde, nicht allein.

Mit diesem kleinen Konsolenprogramm kann man minimale und aktuelle Auflösung der Multimedia-Timer ansehen.

MisterIXI 1. Sep 2015 16:58

AW: Timer läuft ab Mitternacht rückwärts
 
Zitat:

Zitat von SMO (Beitrag 1314305)
Verstehe. Ich hoffe dir ist klar, dass bei einer typischen Bildwiederholfrequenz von 60 Hz ein Zeitabschnitt 1/60 = 16,67 ms beträgt. Also auf die Millisekunde genau messen ist schon drin, jede Millisekunde die Anzeige aktualisieren wäre aber sinnlos. ;)

Klar :D

Aber du bringst mich noch auf eine andere Frage, wenn wir grad dabei sind:
Warum blinkt(/verschwindet kurz) ein Label ab und zu kurz, wenn es ständig durch z.B. Timer aktualisiert wird?
Das ist wahrscheinlich wieder mein Unwissen über manche Zyklen? Vielleicht trifft man bei ein paar frames vom Bildschirm die Zeit, die Delphi visuell updatet oder so? :?:
Kann man sowas lösen, in dem man einfach den "perfekten" Intervall eines Timers einstellt?
Es kann auch nur Wunschdenken sein, aber es scheint dass 17 oder 50 um einiges weniger blinkt als z.B.100...

Und die Geschichte mit TStopwatch scheint auch eine Lösung zu sein, aber die hab ich bis jetzt noch nie gesehen/benutzt... :P Die schaue ich mir defenitiv auch die Tage mal an!

Sir Rufo 1. Sep 2015 17:02

AW: Timer läuft ab Mitternacht rückwärts
 
Zitat:

Zitat von SMO (Beitrag 1314317)
Zitat:

Zitat von Sir Rufo (Beitrag 1314310)
Wozu wird denn ein Timer überhaupt benötigt?

Wenn ich wissen möchte, wieviel Zeit vergangen ist zwischen dem Zeitpunkt x und y, dann berechne ich das einfach. Dazu benötige ich keinen Timer und zum Zeitpunkt der Abfrage ist der Wert zuverlässig genau.

Schöne Lösung, aber rate mal, welche Auflösung/Genauigkeit sie hat. Richtig, exakt dieselbe wie timeGetTime. D.h. standardmäßig 15,625 ms, es sei denn die globale Timer-Auflösung wurde per timeBeginPeriod / NtSetTimerResolution verändert.

Es ging hier mehr um das Prinzip, dass man keinen Timer nimmt um eine Zeitspanne zu bestimmen, sondern man merkt sich die Startzeit und berechnet sich die Zeitspanne zwischen der gemerkten Startzeit und einem beliebigen anderen Zeitwert. Welche Zeitwertquelle man dabei verwendet ist - für das Prinzip - unerheblich, beim Vergleichen sollte es immer die Gleiche sein.

SMO 1. Sep 2015 17:27

AW: Timer läuft ab Mitternacht rückwärts
 
Zitat:

Zitat von MisterIXI (Beitrag 1314321)
Warum blinkt(/verschwindet kurz) ein Label ab und zu kurz, wenn es ständig durch z.B. Timer aktualisiert wird?
Das ist wahrscheinlich wieder mein Unwissen über manche Zyklen? Vielleicht trifft man bei ein paar frames vom Bildschirm die Zeit, die Delphi visuell updatet oder so? :?:
Kann man sowas lösen, in dem man einfach den "perfekten" Intervall eines Timers einstellt?

Wenn die Caption eines Labels geändert wird, muss es neu gezeichnet werden. Also erst mal der komplette Hintergrund wiederhergestellt werden, dann den neuen Text drüberschreiben. Wenn das ständig passiert, wird es flackern. Eine mögliche Lösung wäre Doublebuffering. Probiere mal die "DoubleBuffered" Eigenschaft des Parents des Labels auf True zu setzen (ist das Label direkt auf einer Form, dann Form.DoubleBuffered := True; ist es auf einem Panel, dann Panel.DoubleBuffered := True). Oder statt TLabel mal TStaticText benutzen.


Zitat:

Zitat von Sir Rufo (Beitrag 1314323)
Es ging hier mehr um das Prinzip, dass man keinen Timer nimmt um eine Zeitspanne zu bestimmen, sondern man merkt sich die Startzeit und berechnet sich die Zeitspanne zwischen der gemerkten Startzeit und einem beliebigen anderen Zeitwert. Welche Zeitwertquelle man dabei verwendet ist - für das Prinzip - unerheblich, beim Vergleichen sollte es immer die Gleiche sein.

Was ist ein "Timer"? TTimer? Wurde hier nicht benutzt. Windows hat diverse Counter, die periodisch aktualisiert werden, egal ob ein Programm sie nun abfrägt oder nicht. In diesem Sinne sind GetTickCount, timeGetTime und QueryPerformanceCounter alle Counter, keine "Timer".
Und wie du sagtest, das Prinzip ist genau dasselbe, ob man nun "Start/Endzeit := Now()" oder "Start/Endzeit := timeGetTime()" nimmt. Die Präzision von beidem hängt von der globalen Auflösung ab, die man beeinflussen kann. Dieser wichtige Punkt hat mir hier gefehlt.

Denn im OP wird nach einer "möglichst genauen Zeitmessung" gefragt. Dafür benutzt man am besten QueryPerformanceCounter, oder man muss die globale Auflösung erhöhen.

nahpets 1. Sep 2015 17:37

AW: Timer läuft ab Mitternacht rückwärts
 
Mal ganz naive gefragt:

Du möchtest zum Zeitpunkt X festlegen: Jetzt gehts los.
Zum Zeitpunkt Y sagst Du: Fertig.

Also merkst Du Dir bei X
Delphi-Quellcode:
Start := Now
.
Bei Y berechnest Du
Delphi-Quellcode:
Zeitspanne := Now - Start
.

In der Zwischenzeit soll Irgendwo eine Uhr laufen. Niemand kann so schnell gucken, dass er ein Zeitintervall von 1ms mitbekommt.
Wie oft soll denn die Uhrzeit aktuallisiert werden?
Sekündlich, reicht doch zum Mitgucken.

Also bauen wir was in der Art:
Delphi-Quellcode:
...
  tm.Interval := 1000; // = 1 Sekunde
//  tm.Interval := 500; // = 1/2 Sekunde
//  tm.Interval := 250; // = 1/4 Sekunde
...
procedure TForm1.tmTimer(Sender: TObject);
begin
  Label1.Caption := FormatDateTime('nn:ss:zzz', Now - Start);
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  Start := Now;
  tm.Enabled := true;
end;

procedure TForm1.ButtonEndeClick(Sender: TObject);
begin
  Zeitspanne := Now - Start;
  tm.Enabled := False;
  Label1.Caption := FormatDateTime('nn:ss:zzz', Zeitspanne);
end;
Natürlich gibt es genauere Methoden der Zeitmessung, aber wenn die abhängig davon sind, wann jemand einen Button drückt, ist jeder Aufwand dahingehend, die Genauigkeit um eventuell eine 1/2 Millisekunde zu erhöhen, eigentlich irrelevant.
Und mit Now und der Ausgabe mit FormatDateTime ist man immernoch im Bereich von einer tausendstel Sekunde, so genau werden kaum mal Weltrekorde gemessen und hier geht es um Spiele.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Seite 2 von 3     12 3      

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