Einzelnen Beitrag anzeigen

SMO

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

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