Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi Stopuhr (https://www.delphipraxis.net/49730-delphi-stopuhr.html)

Fredyy 15. Jul 2005 07:23


Delphi Stopuhr
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi,
ich habe heute schnell eine Stopuhr gemacht.
ich hoffe ihr könnt euch das mal angucken und
mir sagen ob die so "genau" ist oder ob die
völlig falsch läuft. danke schon mal.

bye Fredyy

Matze 15. Jul 2005 07:30

Re: Delphi Stopuhr
 
Bei mir (WinXP Home SP2) läuft sie eindeutig zu langsam.

Nachtrag: Timer mit Intervall 1, lustig, aber schwachsinnig. WIndows XP schafft max. 10 ms, Win9x 50 ms, daran liegt es, dass deine Stoppuhr zu langsam ist, stelle das Intervall auf 50 ms, überprüfe entsprechend und die Stoppuhr ist deutlich genauer. Oder schau dir mal das hier an.

s.h.a.r.k 15. Jul 2005 07:37

Re: Delphi Stopuhr
 
Hab ebenfalls XP mit SP1 und die Uhr ist ja verdammt langsam!!! Wie hast du Sie eigentlich programmiert?! Hoffe nicht mit einem Timer!

Matze 15. Jul 2005 07:38

Re: Delphi Stopuhr
 
Zitat:

Zitat von s.h.a.r.k
Hab ebenfalls XP mit SP1 und die Uhr ist ja verdammt langsam!!! Wie hast du Sie eigentlich programmiert?! Hoffe nicht mit einem Timer!

Siehe dir den Quelltext an und du wirst ereknnen, dass es sich um einen TTimer handelt. ;)

s.h.a.r.k 15. Jul 2005 07:47

Re: Delphi Stopuhr
 
Zitat:

Zitat von Matze
Zitat:

Zitat von s.h.a.r.k
Hab ebenfalls XP mit SP1 und die Uhr ist ja verdammt langsam!!! Wie hast du Sie eigentlich programmiert?! Hoffe nicht mit einem Timer!

Siehe dir den Quelltext an und du wirst ereknnen, dass es sich um einen TTimer handelt. ;)

Das konnte ich leider nicht nachschauen, da ich auf diesem Rechner leider kein Delphi hab! sorry

Matze 15. Jul 2005 07:52

Re: Delphi Stopuhr
 
Zitat:

Zitat von s.h.a.r.k
Das konnte ich leider nicht nachschauen, da ich auf diesem Rechner leider kein Delphi hab! sorry

Das würde auch mit Notepad gehen. ;) Aber Fredyy hat nun den Grund für seine ungenaue Stoppuhr und mit Luckies Code aus der Code-Library kann er diese wirklich sehr genau machen, da dieser auf dem CPU-Takt basiert. TTimer eignet sich dafür nicht.

malo 15. Jul 2005 08:04

Re: Delphi Stopuhr
 
Es würde auch ein DXTimer als Alternative zum TTimer reichen. Es gab schon einige Diskussionen darüber. Kurze Zusammenfassung:

Ein Timer (z.B. TTimer) ist ein Thread. Threads laufen immer parallel nebeneinander, statt nacheinander. Wenn man jetzt einen Thread erstellt, der eine geringere Priorität hat, wird er in größeren Abständen aufgerufen als ein Thread mit hoher Priorität (logisch). Und da liegt der Unterschied: Der TTimer hat eine zu niedrige Priorität, um auf 1ms zu laufen (jedenfalls auf aktuellen Systemen). Dafür verbrauchen aber auch schnellere Timer (z.B. DXTimer) mehr CPU-Auslastung ;)

Das sollte imho als Erklärung reichen (wenn ich irgendwo falsch liegen sollte, bitte melden). Das heißt: Es würde also eigentlich schon reichen, wenn du den Timer durch den DXTimer ersetzt (oder durch eine andere, beliebige Timer-Unit, von denen es mittlerweile einige gibt) ;)

FriFra 15. Jul 2005 08:16

Re: Delphi Stopuhr
 
Warum "merkst" Du Dir nicht einfach die Startzeit (Systemzeit beim Start der Stopuhr) und erechnest Dir onTimer die Differenz zur aktuellen Zeit? Bei einem entspr. kurzem Interval läuft die Uhr dann absolut genau (zumindest so genau wie Deine Systemuhr ;) ) und schnell, egal ob der Timer mal schneller oder mal langsamer läuft...

Fredyy 17. Jul 2005 11:04

Re: Delphi Stopuhr
 
wie kann ich die startzeit raus bekommen?

danke schon mal für eure antworten...

3_of_8 17. Jul 2005 11:09

Re: Delphi Stopuhr
 
Delphi-Quellcode:
start:=GetTickCount;
Also sowas in der Art:

Delphi-Quellcode:
interface
//...
var start: Cardinal=0;

//...

implementation

//...

procedure Button1Click(Sender: TObject);
begin
if start=0 then
begin
start:=GetTickCount;
Button1.caption:='Stopp';
label1.caption:='';
end
else
begin
Button1.Caption:='Start';
start:=0;
label1.caption:=inttostr(round((GetTickCount-start)/1000)))+' Sekunden verstrichen.';
end;
end;

//...

end.

Khabarakh 17. Jul 2005 11:18

Re: Delphi Stopuhr
 
Delphi-Quellcode:
start:=0;
label1.caption:=inttostr(round((GetTickCount-start)/1000)))+' Sekunden verstrichen.';
Diese zwei Anweisungen würde ich noch vertauschen :wink: .

Für maximale Genauigkeit solltest du dennoch dem Link weiter oben folgen.

3_of_8 17. Jul 2005 11:22

Re: Delphi Stopuhr
 
Autsch, da hat er recht. :wall:

Ansonsten dürfte es aber stimmen.

Ich progge schon seit einer Woche fast durch, also vergebt mir das. :mrgreen:

Fredyy 17. Jul 2005 11:33

Re: Delphi Stopuhr
 
danke für die ganze hilfe...

jetzt habe ihc ein neues problem.
ich mache die sek,min,std einteilung indem
ich den wert von sek wenn er 60 ist auf 0
zurücksetzen und min um 1 erhöhe.

jetzt baue ich gerade eine schleife (die dann im timer ausgeführt wird).

nur irgend wie funktioniert sie nicht.

Delphi-Quellcode:
zeit := round((GetTickCount-start)/1000);
While i <= zeit do
  begin
    LbSek.Caption := inttostr(strtoint(LbSek.Caption) + 1);
    Inc(i);
  end;
danke nochmals.
bye fredyy

3_of_8 17. Jul 2005 16:01

Re: Delphi Stopuhr
 
Was ist I überhaupt? Mit Std, Min, Sek würde ich das machen:

Delphi-Quellcode:
procedure timer1timer(Sender: TObject); //Hat Interval 100, nicht enabled.
begin
zeit:=trunc((GetTickCount-start)/1000);
h:=trunc(zeit/3600);
min:=trunc((zeit mod h)/60);
s:=zeit mod min;
label1.caption:=inttostr(h)+' : '+inttostr(min)+' : '+inttostr(s);
end;

procedure Button1Click(Sender: TObject);
begin
if start=0 then
begin
button1.caption:='Stop';
start:=GetTickCount;
timer1.enabled:=True;
end
else
begin
timer1.enabled:=False;
timer1timer(Sender);
start:=0;
end;
end;
end;
[edit=alcaeus]delphi-Tags korrigiert. Mfg, alcaeus[/edit]

Fredyy 18. Jul 2005 07:28

Re: Delphi Stopuhr
 
da gibt es noch einen fehler...

Delphi-Quellcode:
min:=trunc((zeit mod h)/60);
s:=zeit mod min;
beide zeilen mit mod geben am anfang devision by zero aus,
da die uhr ja beim starten noch keine minuter oder stunde gelaufen ist.
wie kann ich das abfangen?

EDIT:

Problem selber behoen mit 2 unschönen aber funzenden Abfragen.

Delphi-Quellcode:
zeit:=trunc((GetTickCount-start)/1000);
h:=trunc(zeit/3600);

if (H > 0) then
min1 := (zeit mod h)
else
min1 := zeit;

min:=trunc(min1/60);

if (min > 0) then
s:=zeit mod min
else
s := zeit;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 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