AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStopwatch

Ein Thema von AJ_Oldendorf · begonnen am 14. Aug 2015 · letzter Beitrag vom 18. Aug 2015
Antwort Antwort
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#1

TStopwatch

  Alt 14. Aug 2015, 05:16
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
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#2

AW: TStopwatch

  Alt 14. Aug 2015, 06:54
hallo,

versuch mal

aMessungGes:=TStopwatch.Create;

mfg
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: TStopwatch

  Alt 14. Aug 2015, 07:13
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;

Geändert von hathor (14. Aug 2015 um 08:09 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: TStopwatch

  Alt 14. Aug 2015, 07:59
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: Instanzvariable := Klasse.create; . Create liefert die Klassen-Instanz zurück (genauer: den Pointer, an dem die Klasse beginnt).
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TStopwatch

  Alt 14. Aug 2015, 08:14
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: Instanzvariable := Klasse.create; . Create liefert die Klassen-Instanz zurück (genauer: den Pointer, an dem die Klasse beginnt).
Bei TStopWatch handelt es sich um einen record , der allerdings auch initialisiert werden muss durch eine Zuweisung (auch wenn es dort Möglichkeiten der Selbst-Initialisierung gibt).

BTW TStopWatch.Create ist auch kein constructor sondern eine class function .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Aug 2015 um 08:16 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TStopwatch

  Alt 14. Aug 2015, 08:14
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#7

AW: TStopwatch

  Alt 14. Aug 2015, 22:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: TStopwatch

  Alt 14. Aug 2015, 22:57
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 TStopWatch.Create wird 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#9

AW: TStopwatch

  Alt 14. Aug 2015, 23:22
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

Geändert von hathor (14. Aug 2015 um 23:36 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#10

AW: TStopwatch

  Alt 18. Aug 2015, 10:43
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 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