AW: Timer läuft ab Mitternacht rückwärts
Zitat:
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. |
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; |
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.
|
AW: Timer läuft ab Mitternacht rückwärts
Zitat:
Man zählt über einen Timer aber nicht mit, wieviel Zeit vergangen ist. |
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: |
AW: Timer läuft ab Mitternacht rückwärts
Zitat:
Ü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. |
AW: Timer läuft ab Mitternacht rückwärts
Zitat:
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! |
AW: Timer läuft ab Mitternacht rückwärts
Zitat:
|
AW: Timer läuft ab Mitternacht rückwärts
Zitat:
Zitat:
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. |
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:
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.
...
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; 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. |
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