| Autor |
Beitrag |
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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 
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 13.02.03 11:00
Hi,
danke für die schnelle Antwort
|
|
Mausi
      
Beiträge: 21
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: 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:
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
|
Verfasst: 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.
      
Beiträge: 1596
VS 2013
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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 
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 13.02.03 12:39
Hi,
@Klabautermann
ja klar. So in etwa hatte ich es ja vorher:
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
      
Beiträge: 59
Win2k SP4, WinXP Pro SP1
D6 Pers
|
Verfasst: 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.
|
|