AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Timer läuft ab Mitternacht rückwärts
Thema durchsuchen
Ansicht
Themen-Optionen

Timer läuft ab Mitternacht rückwärts

Ein Thema von MisterIXI · begonnen am 1. Sep 2015 · letzter Beitrag vom 2. Sep 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 1. Sep 2015, 16:21
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#2

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

  Alt 1. Sep 2015, 16:58
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

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... Die schaue ich mir defenitiv auch die Tage mal an!
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#3

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

  Alt 1. Sep 2015, 17:27
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.


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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 18:30 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