Autor Beitrag
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 13.02.03 10:44 
Sers Companeros,

hab mal ne allgemeine Frage zur Timer-Kompo. Wie ist so eure Erfahrung damit, im Bezug auf Genauigkeit.
Ich hab ein Programm geschrieben, in dem meine zwei Timer absolut zuverlässig arbeiten müssen. Der eine läuft im 1 sec-Takt der andere im 2 sec-Takt.
Kann es da nach einer gewissen Zeit zu Abweichungen kommen.

Hab nämlich gehört, dass man lieber den Timer der WinApi nehmen sollte, da dieser sehr genau wäre. Aber eigentlich ist TTimer von der VCL eine Kapselung des WinApi-Timers, oder?

Was meint Ihr dazu?

MFG

- Ernesto -
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 13.02.03 10:53 
Hallo,

Windows ist kein Echtzeitbetriebsystem, somit kann kein Timer absolut zuverlässig arbeiten.

Da eine Sekunde genauigkeit aber eine recht hohe auflösung ist, sollte auch der Windows-Timer zufridenstellend arbeiten können.

Gruß
Klabautermann
ErnestoChe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 13.02.03 11:00 
Hi,

danke für die schnelle Antwort
Mausi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 13.02.03 11:01 
Titel: Nimm besser anderen Timer wenn du ne andere Möglichkeit hast
Die Timer arbeiten zwar recht zuverlässig , aber wenn du zwei Timer zu gleich laufen lassen willst hat Delphi nen paar Problemschen damit.
Die Timer überlagern sich dann und es kommt zu Fehlermeldungen und ähnlichem.

mfg

P.S.:Viel Erfolg
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.02.03 11:07 
Das Problem ist mir noch nicht begegnet. Das kann aber nur passieren, wenn du in beiden Timer-Porzeduren auf ein und das selbe Element, Objekt, Variable zugreifst und dass dann zufällig gleiochzeitig geschiet.

Ansonsten wird es wohl so sein, je mehr Timer man in einem Programm benutzt, desto ungenauer werden sie.
ErnestoChe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 13.02.03 11:35 
Hi,

es geht um folgendes: ich möchte in meinem Download-Tool die aktuelle Download-Geschwindigkeit ermitteln.

Ich habe eine Funktion die mir die bereits heruntergeladenen bytes und die maximale Gösse der Datei liefert.

Ich möchte aus den heruntergeladenen Bytes die in jeder Sekunde neu hinzugekommenen Bytes ermitteln.

Dazu hab ich drei Timer:

ausblenden volle Höhe 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:
var
  ubt: Cardinal;                   // die bereits heruntergeladenen bytes 
  oneSec: Cardinal;             // grösse nach einer sec
  twoSec: Cardinal;             // grösse nach zwei sec

procedure TFrame_download.tmOneSecTimer(Sender: TObject);
begin
  if (start = True) then     // dieser Timer läuft im 1 sec-Takt
  begin
    oneSec := Ubt;           // grösse nach einer sec
  end;
end;

procedure TFrame_download.tmTwoSecTimer(Sender: TObject);
begin
  if (start = True) then   // dieser Timer läuft im 2 sec-Takt
  begin
    twoSec := Ubt;        // grösse nach zwei sec
  end;
end;

procedure TFrame_download.tmKbsTimer(Sender: TObject);
var                                               // Intervall := 1;
  kbs: double;                   
  str: String;
begin
  if (start = True) then
  begin
    kbs := (oneSec - twoSec)/1024;  // Umrechnung in kb
    str := Format('%8.1n', [kbs]);
    lblPtempo.Caption := str+' KB/s';
  end;
end;


Es scheint zu funktionieren. Was mir Sorgen macht ist, ob das zuverlässig funktionieren kann wenn der Download mehrere Stunden gehen sollte.

MFG

- Ernesto -


Zuletzt bearbeitet von ErnestoChe am Do 13.02.03 11:45, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.02.03 11:44 
Ich habe das auch mal gemacht. Aber anderst gelöst, nämlich mit GetTickCount und wenn ich mich richtig erinnere ohne Timer. Kuck dir mal meinen VCL-FTP-Client auf meiner Seite an. Ist mit Source.


Zuletzt bearbeitet von Luckie am Do 13.02.03 11:46, insgesamt 1-mal bearbeitet
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Do 13.02.03 11:45 
es muss doch gar nicht sooo genau sein, da sich die Downloadgeschwindigkeit eh immer ändert....

und schau dir mal Windows an: das ist ein Höchst-Professionelles Programm und selbst bei der Installation von einer CD gibts da manchmal Sprünge von mehreren 10 Minuten... Vorherzusagen ist also ziemlich schwer, da es auch darauf ankommt, was der Nutzer sonst noch alles im Internet macht, ob er noch neue Downloads startet etc.

Fiji-Fighter
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 13.02.03 12:25 
Hallo,

eigentlich benötigst du dann ja nur einen durchschnitswert.
(Aktueller Zeitpunkt - Start Zeitpunkt) / Bisher übertragene Bytes.

Wie Fiji-Fighter richtig feststellt variiert die Downloadgeschwindigkeit ohnehin. Daher ist es nicht möglich eine zuverlässige Prognose abzugeben. Jede angabe ist nur ein näherungswert.

Gruß
Klabautermann
ErnestoChe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 13.02.03 12:39 
Hi,

@Klabautermann

ja klar. So in etwa hatte ich es ja vorher:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  iCount: Integer = 0;   // stopuhr

procedure TFrame_download.Timer2Timer(Sender: TObject);
var
  str, str1: String;
  kbs: double;
begin
  if (start = True) then
  begin
    Inc(iCount);                       // Stopuhr
    kbs := (pUbt/1024) / iCount;
    str := Format('%8.1n', [kbs]);
    lblPtempo.Caption := str+' Kb/s';
  end;
  if (pUbt = pUbtMax) then lblPtempo.Caption := '';  // wenn beendet
end;


Das war halt ne Durschnittsgeschwindigkeit und ich wollte es genauer.

MFG

- Ernesto -
Dargor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 59

Win2k SP4, WinXP Pro SP1
D6 Pers
BeitragVerfasst: Do 13.02.03 13:16 
Ich habe in einem meiner Programme sogar 3 Timer gleichzeitig laufen.
1x 500 msec, 1x 100 msec und 1x 1 msec UpdateInterval
...und habe bis heute keine Probleme, und das, obwohl unter bestimmten Umständen sogar 2 Timer auch gleichzeitig auf die gleiche Komponente zugreifen könnten.
Auch die Performance des Proggys leidet in keinster Weise: max. 2% CPU-Auslastung.