Autor Beitrag
gd0123456
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 09.02.14 03:29 
Hi, hab mal eine Frage zur Timerkomponente. Ich hab zwei Timer. Einer mit dem Interval 1000 und einer mit dem Interval 100.

Schlussendlich soll er einfach nur die Sekunden zählen dann die Minuten etc....

Problem ist dass manchmal die Timer Funktion mit Interval 1000 für 1-2 Sekunden hängen bleibt so dass der Timer mit Interval 100 bereits weiter voran ist. Wo liegt da das Problem.

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
//Berechnet Sekunden und Minuten und Stunden --> Timer Interval 1000
procedure Ttoken_start_bsp.transform(sec: integer);
var
  minute: integer;
  sekunde: integer;
  stunde: integer;
begin

  stunde := floor(sec/3600);
  if ((sec mod 3600) = 0then
  begin
    edit5.text := inttostr(stunde);
    edit6.text := '0';
    edit7.text := '0';
  end
  else
  begin
    minute := floor((sec - (stunde*3600))/60);
    if (((sec - (stunde*3600)) mod 60) = 0 ) then
    begin
      edit6.text := inttostr(minute);
      edit7.text := '0';
    end
    else
    begin
      sekunde := (sec - (stunde*3600)) mod 60;
      edit5.text := inttostr(stunde);
      edit6.text := inttostr(minute);
      edit7.text := inttostr(ceil(sekunde));
    end;
  end;

end

//Timer Interval 1000 - Berechnung der Sekunden dieser Timer hängt für 1-2 Sekunden während der Timer mit 100 weiterzählt
procedure Ttoken_start_bsp.Timer1Timer(Sender: TObject);
begin
   transform(strtoint(edit8.text) div 1000);
end;

//Timer Interval 100
procedure Ttoken_start_bsp.Timer2Timer(Sender: TObject);
begin
  // Edit8 hat den Startwert 0 
   edit8.text := inttostr(strtoint(edit8.text)+100);
end;


Danke für die Hilfe.
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: So 09.02.14 05:36 
Hallo,

eine Timer-Komponente ist für eine genau Zeitmessung ungeeignet. Ich empfehle Dir stattdessen unter Windows GetTickCount oder noch besser den QueryPerformanceCounter zu verwenden. Für die Ausgabe kannst Du bei Bedarf eine Timer-Komponente verwenden. Wobei ich hierbei auch nur möglichst wenige Timer-Komponenten verwenden würde, im Idealfall nur eine.

Viele Grüße
gd0123456 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 09.02.14 17:35 
danke für die Info. Mir ist schon klar dass sie nicht genau ist. Mich wundert es einfach nur dass sie hängen bleibt und dann ein 2-3 Sekunden sind sie wieder synchron. dass ist was ich nicht ganz verstehe.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.02.14 19:40 
Ein Timer funktioniert so, dass das System eine Windows Nachricht in dem angegebenen Abstand in die Nachrichtenwarteschlange deines Programms einreiht. Je nachdem wie hoch die Auslastung des Systems gerade ist und wie beschäftigt dein Programm gerade ist, kann diese Nachricht nicht ganz pünktlich ankommen und wenn dein Programm gerade etwas macht, dauert es ggf. etwas die Nachricht zu verarbeiten.

Deshalb ist der Zeitabstand beim Timer ungeeignet für eine Zeitmessung oder ähnliches. Wenn man genaue Abstände benötigt, kann man den Timer auf eine höhere Frequenz einstellen und darin dann die Zeiten anhand von GetTickCount, dem Performance Counter oder der Uhrzeit prüfen.
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.02.14 12:21 
Genau :beer:

Mit anderen Worten: Man mißt nicht mit einem Timer, sondern löst damit ein Ereignis aus. Das sagt ja bereits der Name: Es ist ein Timer und keine Uhr, Watch, Clock etc. Ein Timer ist sozusagen für das Timing verantwortlich.

In der Ereignisbehandlung des Timers fragt man z.B. das Instrument ab, das die Zeit mißt, nämlich die interne Uhr des Computers, die sowieso immer läuft. Noch anders ausgedrückt: Mit einem Timer setzt man lediglich ein Meßintervall; es soll z.B. jede Sekunde gemessen werden. Z.B. beim Programmieren eines Weckers: Der Timer ist nicht die Uhr, sondern fragt nur ständig bei der Uhr nach: "Ist es jetzt endlich soweit?"

Will man die Dauer von Methoden, Proceduren, Funktionen etc. messen, benötigt man dagegen keinen Timer: Man merkt sich einfach den TDateTime-Wert des Beginns und den am Ende. Zur Ermittlung der vergangenen Zeit gibt es in der Unit DateUtils die beiden Funktionen SecondsBetween und MilliSecondsBetween, die die Zeit zwischen zwei Zeitpunkten zurückliefern.