Timer Interval

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Timer Interval

Beitrag von Mathias »

So wie ich festgestellt habe, ist beim Intervall mit 20ms unter Windows Schluss.
Unter Linux kann ich sogar bis 1ms runter.

Ist dies eine Beschränkung von Windows, das bei 20ms fertig ist, oder liegt da an Lazarus ?

An diesem Beispiel sieht man es gut.

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
const
  z: integer = 0;
begin
  Inc(z);
  Label1.Caption := IntToStr(z);
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Timer Interval

Beitrag von mse »

Siehe auch mein Kommentar von hier:
http://www.lazarusforum.de/viewtopic.php?f=55&t=9414
Auf Windows erlaubt der "Multi-Media-Timer", welche das MSEgui Timersystem verwenden kann, eine Auflösung von 1ms, die normale WM_TIMER -Message ist an den Windows Systemtick von normalerweise etwa 15ms gebunden. Das Windows Tick-Intervall kann mittels timeBeginPeriod() verändert werden:
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Die Auflösung der Lazarus Timer sollte damit verbessert werden können. Die Einstellung hat aber Einfluss auf das gesamte System, siehe Link.
Linux hat keinen festen System-Tick, daher liegt auf Linux die Timerauflösung im Mikrosekunden Bereich.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Timer Interval

Beitrag von mschnell »

mse hat geschrieben:Die Auflösung der Lazarus Timer sollte damit verbessert werden können....
Auflösung ist aber nicht Genauigkeit.

Ein TTimer - Event wird frühestens aufgerufen, wenn der eingestellte entsprechende Zeitpunkt erreicht wird. eine Spezifikation für spätestens gibt es nicht . Zum Zeiten-Messen also ziemlich ungeeignet.

-Michael

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Timer Interval

Beitrag von Mathias »

Zum Zeiten-Messen also ziemlich ungeeignet.
Das denke ich auch, besonders bei kleinen Intervallen.
Ich denke für den Normalfall reichen die 15-20ms locker, schnellere Sachen bekommen unser Auge sowieso nicht mit.
eine Auflösung von 1ms, die normale WM_TIMER -Message ist an den Windows Systemtick von normalerweise etwa 15ms gebunden.
Somit hat sich die Frage geklärt, das es vom OS abhängig ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Timer Interval

Beitrag von wp_xyz »

Ehrlich gesagt, ich verstehe diese Fragestellung überhaupt nicht. Im ersten Post schreibst du etwas davon, dass bei Windows mit dem Timerintervall bei 20 ms "Schluss" wäre. Was soll das bedeuten? Natürlich kann ich kleinere Zeiten in den Timer eintragen. Und in dem Code-Beispiel wird eine Zahl hochgezählt. Was soll das aussagen? Keine Ahnung. Bitte denke beim Formulieren der Frage daran, dass es auch Leute gibt, die von deinem aktuellen Problem überhaupt keine Ahnung haben.

Oder beziehst du dich auf den anderen Thread mit dem Rad, wo unter 20 ms keine Beschleunigung der Drehung mehr erkennbar ist? Wie lange dauert es überhaupt, dieses Drehrad auf den Canvas zu malen? Und erinnere ich mich richtig, dass du Windowsprogramme unter Wine in Linux entwickelst? Wie schnell ist die Graphikausgabe unter Wine im Vergleich zu nativem Linux bzw. Windows? Vielleicht erklärt das schon diese Beobachtung (sofern ich das Richtige reininterpretiert habe...)

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Timer Interval

Beitrag von Timm Thaler »

mschnell hat geschrieben:Ein TTimer - Event wird frühestens aufgerufen, wenn der eingestellte entsprechende Zeitpunkt erreicht wird. eine Spezifikation für spätestens gibt es nicht . Zum Zeiten-Messen also ziemlich ungeeignet.
Von PureBasic unter Windows kenne ich ElapsedMilliseconds(), welches die Millisekunden seit Rechnerstart zurückgibt (innerhalb der Grenzen der Windows Timeslots). Durch Differenzbildung kann man hier sehr gut Zeitspannen messen.

Gibt es einen vergleichbaren Befehl für FreePascal?

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Timer Interval

Beitrag von Warf »

Timm Thaler hat geschrieben:
mschnell hat geschrieben:Ein TTimer - Event wird frühestens aufgerufen, wenn der eingestellte entsprechende Zeitpunkt erreicht wird. eine Spezifikation für spätestens gibt es nicht . Zum Zeiten-Messen also ziemlich ungeeignet.
Von PureBasic unter Windows kenne ich ElapsedMilliseconds(), welches die Millisekunden seit Rechnerstart zurückgibt (innerhalb der Grenzen der Windows Timeslots). Durch Differenzbildung kann man hier sehr gut Zeitspannen messen.

Gibt es einen vergleichbaren Befehl für FreePascal?
GetTickCount aus der Windows API oder der LCL für Cross Kompatibilität


Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Timer Interval

Beitrag von Timm Thaler »

Warf hat geschrieben:GetTickCount aus der Windows API oder der LCL für Cross Kompatibilität
Was gibt der zurück? Millisekunden? Oder irgendwas Prozessortaktspezifisches, was man dann noch mit der CPU-Frequenz verrechnen muß?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Timer Interval

Beitrag von Michl »

Für Windows: https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Verwende ich öfters, in etwa so:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Cnt: QWord;
begin
  Cnt := GetTickCount64;
  Sleep(500);  // mach irgendwas
  Caption := IntToStr(GetTickCount64 - Cnt) + ' Millisekunden hat es gedauert';
end;  

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Timer Interval

Beitrag von Mathias »

Geht GetTickCount64 nicht auch unter Linux ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Timer Interval

Beitrag von Michl »

Mathias hat geschrieben:Geht GetTickCount64 nicht auch unter Linux ?
Geht auch unter Linux. Mir ging es nur um die Dokumentation, da sie für Windows ist, speziell der Systemtimerintervall unter Windows.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten