Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Vergangene Zeit messen
Flamefire - Mi 24.10.07 15:59
Titel: Vergangene Zeit messen
Ich möchte ein Programm starten und dann in Delphi dessen Laufzeit ständig angezeigt bekommen
Und das im Format hh:mm
Ich habe GetTickCount und QueryPerformanceCounter gefunden
Bei GetTickCount ist aber das Problem, das es bei rechenintensiven Programmen (wie meins eins ist) verfälscht werden kann
Warum?
Bei QueryPerformanceCounter könnte es die Ausführgeschwindigkeit beeinträchtigen (da hoher ressourcenverbrauch)
Quelle:
http://www.dsdt.info/tipps/?id=53
Was ist da dran?
Was sollte ich verwenden (hab schon daran gedacht vlt mit Now zu arbeiten
würde das gehen?
Narses - Mi 24.10.07 16:08
Moin!
Was spricht denn gegen die Systemzeit beim Start zu merken und dann die Differenz zu Now zu bestimmen? :gruebel:
cu
Narses
Flamefire - Mi 24.10.07 16:20
also so:
Delphi-Quelltext
1: 2: 3:
| start:=Now; ... ende:=Now; |
Ok und dann?
wie wandle ich das dann um?
War das nicht eine float zahl mit tagen vorm komma?
elundril - Mi 24.10.07 18:50
ich glaub die kann man einfach abziehen:
Delphi-Quelltext
1: 2: 3:
| runtime := stop - start;
label1.caption := FormatDateTime('hh:mm:ss'); |
lg elundril
Calculon - Mi 24.10.07 19:23
Ich mach' des immer so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| function Seconds: Double; var Hour, Min, Sec, MSec: Word; begin DecodeTime(Now, Hour, Min, Sec, MSec); Seconds := 3600 * Hour + 60 * Min + sec + MSec / 1000; end;
[..]
var start, stop, total: double; begin Start := Seconds; Stop := Seconds; total := stop - start; if total <= 60 then writeln(' Benötigte Zeit: ', total:4:1, ' Sekunden'); if (total > 60) and (total <= 3600) then writeln(' Benötigte Zeit: ', (total/60):4:1, ' Minuten'); if total > 3600 then writeln(' Benötigte Zeit: ', (total/3600):5:2, ' Stunden'); end; |
Gruß
Calculon
--
TProgger - Mi 24.10.07 19:26
Hi FlameFire, hier mal ne Proc, die die Windows-Uptime ausgibt.
Sollte ja nicht so schwer sein, das umzustricken für deinen Zweck:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function UpTime: string; const ticksperday : Cardinal = 1000 * 60 * 60 * 24; ticksperhour : Cardinal = 1000 * 60 * 60; ticksperminute : Cardinal = 1000 * 60; tickspersecond : Cardinal = 1000; var t : longword; d, h, m, s : Cardinal; begin t := GetTickCount; d := t div ticksperday; dec(t, d * ticksperday); h := t div ticksperhour; dec(t, h * ticksperhour); m := t div ticksperminute; dec(t, m * ticksperminute); s := t div tickspersecond; Result := 'Windows-Uptime: '+IntToStr(d)+ ' Tage '+IntToStr(h)+' Stunden '+IntToStr(m)+' Minuten '+IntToStr(s)+' Sekunden'; end; |
Da könnte man eine Function (ZeigeZeit) draus machen, der man Millisekunden (wie sie GetTickCount liefert) übergibt und als formatierten String ausgibt.
Also etwa so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var Start, AktuelleZeit: Cardinal;
Start:=GetTickCount;
AktuelleZeit:=GetTickCount-Start; LabelX.Caption:=ZeigeZeit(AktuelleZeit); |
Flamefire - Do 25.10.07 14:30
ok danke
ich glaube das sind genug lösungen
hab dann die von elundril genommen weils die einfachste ist
warum macht man das nicht immer so?
man kann ganz leicht alle daten anzeigen und mit *24*3600 hat man auch die sekunden wenn man sie braucht samt ms
Mitmischer 1703 - Do 25.10.07 15:01
Mach's doch mit Sleep()! Und pro Sekunde zählst du dann eben 1012/1011/1013 ms dazu! :roll: [mach ich bei meinem Reaktionszeitmesser auch so!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!