Entwickler-Ecke

Sonstiges (Delphi) - genauenb timer schaffen!


dude - Sa 15.02.03 15:38
Titel: genauenb timer schaffen!
Hi erstmal alle !

Also ich hab folgendes Problem:

Ich will Zeit stoppen und danach die Zeit addieren. Das will ich machen, weil ich einen Timer bauen will, der genau ist! Daher hatte ich die Idee die SystemZeit zu holen, nach einer 'Timer-Sekunde(Interval:1000)' nochmal die Zeit holen und dann die voherige Zeit von dieser abzuziehen!

Fals dies dort oben umständlich geschrieben ist:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private
  Zeitholen : Time;
  Zeitnochmalholen : Time;
  Zeitfertig : Time;
public

procedure Button1.click (sender: TObject)
begin
  Zeitholen := time;
end;

procedure Timer1.timer (..)
begin
  Zeitnochmalholen := time;
  Zeitfertig := Zeitnochmalholen - Zeitholen;
  Label1.caption := Zeitfertig;
end;

So sieht das in Code aus, wie ich die Zeit berechnen will. Bloss funktioniert dieser Code nicht.

Wäre mir sehr hilfreich wenn mirjemand helfen könnte !

MFG, dude


GruppeCN - So 16.02.03 13:02

Ich glaube das man es so machen könnte:


Quelltext
1:
2:
3:
const plus = '00:00:01';

var zeit, zwischen: TTime;


Form1.Create:


Quelltext
1:
2:
3:
begin
zeit := Time;
end;


Dazu zählen:


Quelltext
1:
2:
3:
4:
5:
procedure Timer1.timer (..)
begin
zwischen := StrtoTime(plus);
zeit := zeit + zwischen;
end;


Du kannst dieses Beispiel Downloaden:

http://www.gruppecn.de/download.php?link=produkte/time/timer.zip


Fred Ferkel - Mo 17.02.03 21:30

hoi hoi
nicht das ichs ganz checke was die frage ist aber so kannst du recht
präzise herausfinden wieviel zeit vergangen ist...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  x:single;

..button1click...
begin
  x:=gettickcount;
end;

..button2click...
begin
  caption:=floattostr(gettickcount-x); //in millisekunden...sollte genau genug sein..
end;



aber was willste mit dem timer machen??

cya
oink oink


GruppeCN - Di 18.02.03 17:26

Im grunde bringt das alles nichts, denn du zählst die Zeit um eine Sekunde hoch. Und das durch einen Timer(der dir zu ungenau ist) alle 1000 Millisek.. Also ...


Fred Ferkel - Di 18.02.03 23:50

wie stehts damit? :D

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
  x:single;
  i:integer;
begin
  x:=gettickcount;
  for i:=1 to 10 do
    begin
      while (gettickcount-x)<i*1000 do
        application.ProcessMessages;
      caption:=inttostr(strtoint(caption)+1);
    end;
end;


dude - Mi 05.03.03 13:29

wie würdest du es dann machen ?
es soll ja im format hh:mm:ss sein. und es soll jede sekunde
um eins erhöht werden! Und damit man das genau machen kann bietet
sich doch die systemzeit an ! zeit holen, nach ner sekunde zeit holen, zeit voneinander abziehen, ergebnis(00:00:01) mit altem ergebnis addieren!


mars - Mi 05.03.03 13:39

Also wenn es dir nur um eine Sekundenanzeige geht, dann maches einfach mit einem Timer: Bei Button.Click Timer aktivieren (Intervall:=1000) und beim Timer-Ereignis eine globale Variable um eins hochzählen und die Label Anzeige updaten.
Wenn es dir aber um eine genaue Messung einer Zeitdifferenz geht, dann such mal nach QueryPerformanceCounter hier auf dem Forum. Hab mal irgendwo auch ein Codeschnipsel dazu gepostet.
Gruss


Fred Ferkel - Mi 05.03.03 16:16

er will doch nen timer machen der besser ist als der standard-timer...von daher..naja egal aber queryperformancecounter wäre tatsächlich noch besser aber wie genau will man es denn nun eigentlich haben??


dude - Do 06.03.03 20:30

hmpf, also ich hab das nu gelöst:

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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
unit zeitsuchen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    procedure zeitholen;
    procedure zeitholen2;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bolfunc : Boolean = True;
  a,b,c : TTIme;
implementation

{$R *.dfm}

procedure TForm1.zeitholen;
begin
  a := Time;
  label2.Caption := TimeToStr(a);
end;

procedure TForm1.zeitholen2;
begin
 B := Time;
 C := B - A + StrToTime(label1.Caption)+StrToTime('00:00:01');
 label1.Caption := TimeToStr(c);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if bolfunc then zeitholen
               else zeitholen2;
 bolfunc := not bolfunc;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled := false;
end;

end.


so bekomm ich die genaue Zeit, und kann somit einen stinkegenauen timer bauen !