Autor Beitrag
holger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 46

W2K pro, XP pro
Delphi 6, Delphi 2007
BeitragVerfasst: Fr 03.04.20 19:22 
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.
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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:

  • Beim Start nimmt man einmal per GetTickCount die aktuelle Zeit und speichert diese in einer Variablen.
  • Im TimerEvent nimmt man erneut GetTickCount, ermittelt die Differenz zum Startwert und zeigt diesen Wert an.


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.

_________________
We are, we were and will not be.
holger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 46

W2K pro, XP pro
Delphi 6, Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: LorenzS