Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TStopwatch (https://www.delphipraxis.net/186213-tstopwatch.html)

AJ_Oldendorf 14. Aug 2015 04:16

TStopwatch
 
Hallo,
habe Win 8.1, XE7 und nutze die TStopWatch aus System.Diagnostics.
Folgendes Beispiel:

Nehmt eine neue Anwendung und einen Button drauf.
Im Click Event dann folgenden Code:

Delphi-Quellcode:
var
  aMessungGes : TStopWatch;
begin
  aMessungGes.Create;
  aMessungGes.Start;

  //hier kann was stehen, muss aber nicht

  aMessungGes.Stop;
  ShowMessage('Zeitmessung Gesamt (s): ' +
               IntToStr(Round(aMessungGes.ElapsedMilliseconds/1000)));
Ich bekomme beim Starten und Button Click immer eine negative Zahl angezeigt in meiner ShowMessage. Ich habe da mal bisschen rein debuggt und festgestellt, dass die interne Variable "FElapsed" der TStopWatch beim .Create und .Start nicht auf 0 gesetzt wird. Da steht immer eine Zahl > 0 drinne. Wenn dann das ".Stop" kommt, ist die interne Variable FElapsed negativ.
Könnt ihr das nachstellen?

Viele Grüße

frankyboy1974 14. Aug 2015 05:54

AW: TStopwatch
 
hallo,

versuch mal

aMessungGes:=TStopwatch.Create;:roll:

mfg

hathor 14. Aug 2015 06:13

AW: TStopwatch
 
http://docwiki.embarcadero.com/Libra...opwatch.Create

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   sw : TStopWatch;
   elapsedMilliseconds : INT64;
 begin
   sw := TStopWatch.Create() ;

     sw.Start;
     sleep(1000); //nur test
     sw.Stop;

     elapsedMilliseconds := sw.ElapsedMilliseconds;
     Memo1.Lines.Add(INTTOSTR(elapsedMilliseconds));
 end;

Perlsau 14. Aug 2015 06:59

AW: TStopwatch
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1312100)
Delphi-Quellcode:
aMessungGes.Create;

Grundsätzlich: Instanzen erzeugt man nicht, indem man die Klasse zu erzeugen versucht, sondern die zuvor deklarierten Instanz-Variable mittels Create initialisiert. Das geschieht immer durch eine Zuweisung:
Delphi-Quellcode:
Instanzvariable := Klasse.create;
. Create liefert die Klassen-Instanz zurück (genauer: den Pointer, an dem die Klasse beginnt).

Sir Rufo 14. Aug 2015 07:14

AW: TStopwatch
 
Zitat:

Zitat von Perlsau (Beitrag 1312106)
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1312100)
Delphi-Quellcode:
aMessungGes.Create;

Grundsätzlich: Instanzen erzeugt man nicht, indem man die Klasse zu erzeugen versucht, sondern die zuvor deklarierten Instanz-Variable mittels Create initialisiert. Das geschieht immer durch eine Zuweisung:
Delphi-Quellcode:
Instanzvariable := Klasse.create;
. Create liefert die Klassen-Instanz zurück (genauer: den Pointer, an dem die Klasse beginnt).

Bei
Delphi-Quellcode:
TStopWatch
handelt es sich um einen
Delphi-Quellcode:
record
, der allerdings auch initialisiert werden muss durch eine Zuweisung (auch wenn es dort Möglichkeiten der Selbst-Initialisierung gibt). ;)

BTW
Delphi-Quellcode:
TStopWatch.Create
ist auch kein
Delphi-Quellcode:
constructor
sondern eine
Delphi-Quellcode:
class function
.

Daniel 14. Aug 2015 07:14

AW: TStopwatch
 
Das ist für Klassen unbestritten richtig, aber TStopWatch ist ein Record.
Die Instanz ist also grundsätzlich valide, nur eben noch nicht korrekt initialisiert.

//edit: menno. zu spät.

AJ_Oldendorf 14. Aug 2015 21:04

AW: TStopwatch
 
Das mit dem Record war mir schon klar, deswegen ja auch mein entsprechendes Beispiel ;-)
Könnt ihr denn das gleiche Verhalten feststellen oder funktioniert das bei euch?

Grüße

Uwe Raabe 14. Aug 2015 21:57

AW: TStopwatch
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1312163)
Das mit dem Record war mir schon klar, deswegen ja auch mein entsprechendes Beispiel ;-)
Könnt ihr denn das gleiche Verhalten feststellen oder funktioniert das bei euch?

Das kann nicht funktionieren! In der Implementation von
Delphi-Quellcode:
TStopWatch.Create
wird
Delphi-Quellcode:
result.Reset
aufgerufen. In deinem Beispiel wird der Result aber verworfen.
Da Create eine Klassenfunktion ist, kann sie auch gar keine Auswirkungen auf deine Instanz haben, da bei einer (statischen) Klassenfunktion kein Self mitgegeben wird. Das Verhalten ist somit nicht nur nachvollziehbar, sondern auch konsistent und so gewollt.

Folgende Verfahren funktionieren aber:
Delphi-Quellcode:
 
  aMessungGes.Create;
  aMessungGes.Reset;
  aMessungGes.Start;
  ...

  aMessungGes := TStopWatch.Create;
  aMessungGes.Start;
  ...

  aMessungGes := TStopWatch.StartNew;
  ...
Das Create im ersten Teil ist sogar (mindestens einmal) notwendig, damit die Klassenfelder initialisiert werden.

hathor 14. Aug 2015 22:22

AW: TStopwatch
 
Beispiel für längere Zeiten:
Delphi-Quellcode:
procedure MM(s:String); Begin Form2.Memo1.Lines.Add(s); end;

function MSecToTime(mSec: Int64): string;
 var dt : TDateTime;
 begin
    dt := mSec / MSecsPerSec / SecsPerDay;
    Result := Format('%d days, %s', [trunc(dt), FormatDateTime('hh:nn:ss', frac(dt))]); //Tage Stunden Minuten Sekunden
 end;

function MSecToTime2(mSec: Int64): string;
var dt : TDateTime;
begin
    dt:= mSec / MSecsPerSec / SecsPerDay;
    Result:= Format('%d days, %s', [Trunc(dt),
    FormatDateTime('hh:nn:ss.z', Frac(dt))]) ; //incl. tausendstel sec
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  aMessungGes : TStopWatch;
begin
  aMessungGes:= TStopWatch.Create;
  aMessungGes.Start;
      Sleep(2500); // Beispiel
  aMessungGes.Stop;
  MM('Zeitmessung Gesamt (s): ' +
    IntToStr(Round(aMessungGes.ElapsedMilliseconds/1000))); //sinnlos !!!
  MM('Zeitmessung Gesamt (ms): ' + IntToStr(aMessungGes.ElapsedMilliseconds));
  MM('Zeitmessung: '+ MSecToTime(aMessungGes.ElapsedMilliseconds));
  MM('Zeitmessung: '+ MSecToTime2(aMessungGes.ElapsedMilliseconds));
end;
Ergebnis:
Zeitmessung Gesamt (s): 2
Zeitmessung Gesamt (ms): 2500
Zeitmessung: 0 days, 00:00:02
Zeitmessung: 0 days, 00:00:02.500

AJ_Oldendorf 18. Aug 2015 09:43

AW: TStopwatch
 
Stimmt, das Result.Reset im Create hatte ich gar nicht so für voll genommen ;-)
Wenn ich das .Reset nach dem Create aufrufe funktioniert es wie gewollt.
Danke für die Hilfe

Viele Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz