Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Timer Problem unter Windows 10


holger - Fr 03.04.20 19:22
Titel: Timer Problem unter Windows 10
Hallo,

seit vielen Jahren, muss ich hier wieder mal um Hilfe bitten.
Mal sehen, ob ihr mir irgend wie aus der Missere helfen könnt.

Ich programmiere noch in Delphi 7 /RAD-Studio. Delphi läuft bei mir in einer VM unter Windows.
Ihr merkt schon, ich lebe noch bissel in der Steinzeit ;/

Nun habe ich ein feines Programm geschrieben, mit welchem ich Massstabsgerechte Geschwindigkeiten z.B. von
Modelleisenbahnen messen kann.
http://olbnet.selfhost.eu/reither/theo.htm
Das Programm funktioniert in der VM auch wunderbar.

Das gleiche Programm auf dem gleichen Rechner aber im "richtigeb Betriebssystem" Windows10 64-Bit Prof tut es nicht
:((
Hier läuft mein Timer viel zu langsam.

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TFrameGeschwindigkeit.Timer1Timer(Sender: TObject);
begin
  Millisekunden:=Millisekunden+10;
  NurZeitAnzeige(Millisekunden);
end;

Als Intervall sind 10ms eingestellt

Was kann ich tun, damit mein Timer richtig geht?

Vielen Dank für eure Bemühungen,
beste Grüße
Holger

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Eine Idee hatte ich gerade noch.

Verknüpfung zum Programm erstellt.. Programm im Kompatibilitätsmodus ausführen (Win98 und WinXP ausprobiert)

Hat auch nix gebracht


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 04.04.2020 um 02:37


Gausi - Fr 03.04.20 20:16

10 Millisekunden für einen Timer haben noch nie zuverlässig funktioniert. Zumindest gab es keine Garantie dafür.

Es scheint so, als wolltest du damit eine Anzeige der vergangenen Zeit (wie bei einer Stoppuhr?) realisieren. Das macht man besser so:



Wenn der Timer dann mal nicht exakt läuft, weil das Programm grade anderweitig beschäftigt ist, macht das nichts, und kleine Ungenauigkeiten summieren sich mit der Zeit auch nicht auf. Sinnvolle Intervalle für die Anzeige sind dann so bei 100-250ms. Für andere Zwecke ggf. etwas kürzer setzen.


holger - Fr 03.04.20 22:24

Vielen Dank Gausi.
Ich hatte selbst noch mit TDataTime experimentiert. Aber da kam auch schon deine Antwort.
Super . Es funktioniert!!!!


LorenzS - Sa 04.04.20 14:35

Hallo,

nach meinen Erfahrungen mit Timern sind Intervalle unter 15ms unter Client Betriebssystemen, Windows 7 und 10, nicht möglich.

Bei 15ms liegen die Zeitdifferenzen bei 15ms oder 30 ms im Durchschnitt 15,6ms.
Bei 16ms ist der Durchschnitt schon bei 25,?ms.

Selbst bei höheren werden Werten schwankt der Timeraufruf um +- 15ms.

GetTickCount ist genauso ungenau wie der Timer.
Entweder gibt er 0ms oder 15ms zurück.

Ich bevorzuge den MultimediaTimer(ab XP), min. 1ms, oder zur Zeitmessung den QueryPerformanceCounter(ab Windows 2000) ~µs genau.


MfG
Lorenz


Gausi - Sa 04.04.20 15:56

user profile iconLorenzS hat folgendes geschrieben Zum zitierten Posting springen:
GetTickCount ist genauso ungenau wie der Timer.
Entweder gibt er 0ms oder 15ms zurück.

Das mag sein. Aber mit der Methode, die ich skizziert habe, ist der Fehler immer nur so groß, wie der Fahler von GetTickCount. Bei der Timer-Methode, bei der im OnTimer-Event die Zeit hochgezählt wird, summieren sich ggf. im Laufe der Zeit die Fehler zu spürbaren Fehlern auf.

Da es hier dem Anschein nach nicht um Echtzeit-Anwendungen oder Zeitmessungen geht, bei denen wenige Millisekunden Fehler relevant sind, sollte das ausreichen.