![]() |
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:
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.
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))); Könnt ihr das nachstellen? Viele Grüße |
AW: TStopwatch
hallo,
versuch mal aMessungGes:=TStopwatch.Create;:roll: mfg |
AW: TStopwatch
![]()
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; |
AW: TStopwatch
Zitat:
Delphi-Quellcode:
. Create liefert die Klassen-Instanz zurück (genauer: den Pointer, an dem die Klasse beginnt).
Instanzvariable := Klasse.create;
|
AW: TStopwatch
Zitat:
Delphi-Quellcode:
handelt es sich um einen
TStopWatch
Delphi-Quellcode:
, der allerdings auch initialisiert werden muss durch eine Zuweisung (auch wenn es dort Möglichkeiten der Selbst-Initialisierung gibt). ;)
record
BTW
Delphi-Quellcode:
ist auch kein
TStopWatch.Create
Delphi-Quellcode:
sondern eine
constructor
Delphi-Quellcode:
.
class function
|
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. |
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 |
AW: TStopwatch
Zitat:
Delphi-Quellcode:
wird
TStopWatch.Create
Delphi-Quellcode:
aufgerufen. In deinem Beispiel wird der Result aber verworfen.
result.Reset
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:
Das Create im ersten Teil ist sogar (mindestens einmal) notwendig, damit die Klassenfelder initialisiert werden.aMessungGes.Create; aMessungGes.Reset; aMessungGes.Start; ... aMessungGes := TStopWatch.Create; aMessungGes.Start; ... aMessungGes := TStopWatch.StartNew; ... |
AW: TStopwatch
Beispiel für längere Zeiten:
Delphi-Quellcode:
Ergebnis:
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; Zeitmessung Gesamt (s): 2 Zeitmessung Gesamt (ms): 2500 Zeitmessung: 0 days, 00:00:02 Zeitmessung: 0 days, 00:00:02.500 |
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 20:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz