GetTickCount64 liefert falsche Anzahl an Ticks

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Vamogu05
Beiträge: 4
Registriert: Fr 13. Aug 2021, 10:51

GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Vamogu05 »

Schönen, guten Tag,

ich dachte die Funktion GetTickCount64 von Lazarus soll unter Windows die Millisekunden seit dem letzten Einschalten des PCs liefern.
Ich habe dazu ein kleines Testprogramm geschrieben was diese Aussage nicht bestätigt.
Ich bekomme stark unterschiedliche Werte. Manchmal größer 400 Millionen. Das würde ca. 111 Stunden bedeuten. Der PC wird aber immer in der Nacht abgeschaltet.
Heute bekomme ich einen Wert von 72Mio. nach einer Einschaltzeit von ca. 3 Stunden.
Kann das mal jemand nachvollziehen welche Anzahl von Ticks bei Euch geliefert werden? Außerdem ist das von Tag zu Tag unterschiedlich.

Code: Alles auswählen

var Value: Int64;
begin
  Value:=GetTickCount64;
  Label1.Caption:=IntToStr(Value);
end;   
Ich verwende Lazarus in der Version 2.0.10, FPC-Version: 3.2.0.

Liebe Grüße

Hannes

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

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von wp_xyz »

Vielleicht bist du ein Opfer der neuesten "Optimierung", den PC beim Herunterfahren nur schlafen zu legen, statt ihn wirklich auszuschalten. Mit solchen Tricks versucht man, die Zeit für das erneute Einschalten zu verkürzen (zumindest bei Windows). Wiederhole deinen Test einmal nach "Neu starten",

Vamogu05
Beiträge: 4
Registriert: Fr 13. Aug 2021, 10:51

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Vamogu05 »

Tatsächlich stimmen die Ticks nach einem Neustart.
Auf das wäre ich nie gekommen. Danke für die Erleuchtung.

Lg

Hannes

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Winni »

Hallo!

Zwei Anmerkungen:

Erstens ist der DatenTyp von getTickCount64 ein QWord und nicht ein Int64.
Da getTickCount64 aber einen Zeitraum von ~ 500 000 000 Jahren umfasst, spielt das erst ab der Hälfte dieses Zeitraum eine Rolle - also nie. Bei anderen Funktionen solltest Du aber genau auf den Typ des Rückgabewerts achten.

Zweitens wird getTickCount64 meistens für die Berechnung eines Zeitraums genutzt, so dass der Anfangswerts keine Rolle spielt. Beispiel:

Code: Alles auswählen

Procedure xyz;
var StartZeit, Differenz: QWord;
begin
StartZeit := getTickCount64;
// zeitfressende Berechnungen
Differenz := getTickCount64-StartZeit;
showMessage (IntToStr(Differenz));
end;
Winni

Vamogu05
Beiträge: 4
Registriert: Fr 13. Aug 2021, 10:51

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Vamogu05 »

Hallo Winni.

danke für die beiden Hinweise. Das könnte vielleicht mit meinem Problem zu tun haben. Ich habe eine "Warte-Funktion" geschrieben, die an manchen Tagen nicht richtig funktioniert:

Code: Alles auswählen

procedure TForm1.warte(n:Int64);
var diff,t: Int64;

    f: Single;
begin

    t:=GettickCount64();
    Shape6.Brush.Color:=$00FCEBCD;
    while (GettickCount64()<t+n*1000) and not Terminate do
    begin

      Application.ProcessMessages;
      diff:=(n*1000)-(Gettickcount64()-t);
      f:=diff/(n*1000)*Shape6Breite;
      Shape6.Width:=Round(f);
    end;
    Shape6.Width:=Shape6Breite; Shape6.Brush.Color:=$00FCEBCD;
end;  
In dieser Funktion stelle ich über ein Shape einen Countdown dar.
Ich denke, dass ich diese Funktion umschreiben sollte:
while (GetTickCount64()-t <n*1000 and not Terminate do

Könnte meine o.a. Funktion tatsächlich zu Problemen führen?
Lg Hannes

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Socke »

In Formularen solltest du auf Timer umstellen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

siro
Beiträge: 731
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von siro »

Ich staune grade über GetTickCount64() mit Klammern :shock:
Ich wuste garnicht dass man bei Funktionen, die nur etwas zurück liefern, einen leeren Parameter angeben darf
und habe das grad mal probiert. Tatsächlich das funktioniert. Man lernt nie aus.
Vermutlich kommt der Hannes aus der C-Programmierung.... :wink:

Code: Alles auswählen

function MyFunc:Int64;
begin
  result:=1234;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  caption:=IntToStr(MyFunc());   // oder halt IntToStr(MyFunc);
end;
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Winni »

Hallo!

Manche können anscheinend nicht lesen.

Also noch einmal:

function GetTickCount64: QWord;

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Winni »

Hi!

Ich hab den Code etwas überarbeitet.

* Eingabe von Sekunden: da langt ja wohl ein Word. MaxWord sind 18 Stunden. Oder möchtest Du länger warten?
* Die fehlerhaften Int64 durch QWord ersetzt
* Gleich mal n mit 1000 multipliziert, damit das nicht insgesamt dreimal passiert.
* Aufgeräumt mit deiner "Klammeritis"
* Unklar war, woher "Shape6Breite" kommt. Ich berechne das denn mal am Anfang der Procedure.

Ja, wie nennen wir das Ding denn nun? Countdown-rückwärts-Progressbar???

Code: Alles auswählen

procedure TForm1.warte(n:word);
var diff,t: Qword;
    Shape6Breite : Integer;
    f: Single;
begin
   n := n * 1000;
   Shape6Breite := shape6.width;
    t:=GettickCount64;
    Shape6.Brush.Color:=$00FCEBCD;
    while GettickCount64<t+n  do
    begin
      Application.ProcessMessages;
      diff:=n-Gettickcount64 + t;
      f:=diff/(n)*Shape6Breite;
      Shape6.Width:=Round(f);
    end;
    Shape6.Width:=Shape6Breite;
    Shape6.Brush.Color:=$00FCEBCD;
end;

Wo hattest Du denn das "terminated" her.?? Das ist etwas für TThreads. Und den wolltest Du doch wohl nicht, oder?

Winni

Vamogu05
Beiträge: 4
Registriert: Fr 13. Aug 2021, 10:51

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von Vamogu05 »

Hallo Winni,

Danke für Dein Beispiel. Ja, ist natürlich etwas optimaler geschrieben.
Das Terminated ist eine globale Variable die von anderer Stelle gesetzt werden kann.
Mit Threads kenne ich mich leider noch nicht aus. Möchte ich aber auch lernen zu verstehen.

Lg

Hannes

PascalDragon
Beiträge: 829
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: GetTickCount64 liefert falsche Anzahl an Ticks

Beitrag von PascalDragon »

siro hat geschrieben:
Fr 13. Aug 2021, 16:30
Ich staune grade über GetTickCount64() mit Klammern :shock:
Ich wuste garnicht dass man bei Funktionen, die nur etwas zurück liefern, einen leeren Parameter angeben darf
und habe das grad mal probiert. Tatsächlich das funktioniert. Man lernt nie aus.
Vermutlich kommt der Hannes aus der C-Programmierung.... :wink:
Du kannst bei Funktionen und Prozeduren ohne Parameter (oder mit nur Standardparametern) jederzeit ein leeres Klammerpaar nutzen (das geht auch in Delphi und glaub auch TP). In den nicht-Delphi und nicht-TP Modi ist es sogar notwendig, wenn du eine Prozedur- oder Methodenvariable hast und diese keine Parameter hat, um es leichter unterscheidbar von einer Zuweisung der Variable zu machen.
FPC Compiler Entwickler

Antworten