![]() |
Timer viel zu ungenau?
Hallo Freunde,
endlich funktioniert mein Kostenzähler mit automatischer Verbindungserkennung! :dancer: ABER: der zeigt die aktuelle verbindungsdauer an (mit einem Timer (1s)); vergleicht man die aber mal mit der anzeige der dfü-verbindung, stimmen sie schon nach ca. 2 minuten um mehrere sekunden NICHT überein.. das macht mehrere minuten aus in 2-3 stunden! gibt es irgendwie eine möglichkeit, etwas WIRKLICH JEDE SEKUNDE zu aktualisieren? vielleicht liegt das ja daran, dass noch zusätzlich die Rechenzeit mit einfließt, in der der timer den QT ausführt? ich zeig euch einfach meinen text:
Delphi-Quellcode:
type
Uhr = Record H : string; M : string; S : string; end; //Alle String, damit ich sie gleich nem Label zuw. kann var Satz : string := '0,89' //Kosten in ct/min ... procedure Tform1.Uhrzeit(var Zeit : Uhr; welche : integer); begin if StrtoInt(Zeit.S) >= 59 then begin if StrtoInt(Zeit.M) = 59 then begin Zeit.H := InttoStr(StrtoInt(Zeit.H) + 1); Zeit.M := '00'; if StrToInt(Zeit.H) > 2 then Label9.Font.Color:=clred; end; if StrtoInt(Zeit.M)<59 then Zeit.M:=InttoStr(StrtoInt(Zeit.M)+1); Zeit.S := IntToStr(StrToInt(Zeit.S) - 60); if welche = 1 then Label15.Caption := FloattoStr(StrtoFloat(Label15.Caption) + (StrtoFloat(Satz) / 100)); if welche = 2 then Label8.Caption := FloattoStr(StrtoFloat(Label8.Caption) + (StrtoFloat(Satz) / 100)); end; if StrtoInt(Zeit.S) < 59 then Zeit.S := InttoStr(StrtoInt(Zeit.S) + 1); if length(Zeit.H) = 1 then Zeit.H := '0' + Zeit.H; if length(Zeit.M) = 1 then Zeit.M := '0' + Zeit.M; if length(Zeit.S) = 1 then Zeit.S := '0' + Zeit.S; end; ... procedure TForm1.Timer1Timer(Sender: TObject); // Intervall = 1000 ms begin Uhrzeit(Jetzt,1); Uhrzeit(Heute,2); end; ein beispiel der differenz: DFÜ-Anzeige: 01:48:24 Online Meine Anzeige: 01:41:11 Online :cry: Hoffe, ihr könnt mir helfen! MfG Lefko. [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: Timer viel zu ungenau?
Wenn ich das richtig sehe, dann addierst Du bei jedem Timer-Aufruf einfach eine Sekunde (=Intervall) zu Deiner Zeit. Leider darfst Du bei der Verwendung eines Timers nicht davon ausgehen, dass das Ereignis genau zu der gewünschten Zeit ausgelöst wird, genaugenommen ist 'Intervall' sowas wie eine Mindestzeit.
Du könntest aber z.B jedesmal, wenn der Timer feuert, mit GetTickCount die seit dem Windowsstart vergangenen Millisekunden messen und zu Deiner Zeit hinzuaddieren. Du musst natürlich beim Verbindungsaufbau die Startzeit messen und immer abziehen... Ciao, teebee |
Re: Timer viel zu ungenau?
Oder du machst da irgendwas mit
Delphi-Quellcode:
D.h. der Rechner wartet 1s mit deiner Schleife oder so. Ich denke, dass das etwas genauer ist.
sleep(1000);
MfG Florian :hi: |
Re: Timer viel zu ungenau?
Zitat:
Gruss, teebee |
Re: Timer viel zu ungenau?
Hi,
da ich dieses Thema schon mehrmals in eigenen Anwendungen hatte kann ich ganz sicher die von teebee vorgeschlagene Variante mit GetTickCount empfehlen. Man kann natürlich auch über Date oder Time gehen, aber für mich hat sich teebee's Methode als die Beste herausgestellt. Das mit dem Sleep ist keine gute Idee. Erstens verbraucht der Code für die Rechnerei auch Zeit, und so kommt nach jeder Sleep-Sekunde auch immer ein kleiner Offset dazu der sich über die Zeit addiert. Dann friert Sleep auch deinen Thread ein und solange du nicht extra für die Zeitmessung einen eigenen schreibst passiert das, was teebee sagte (Dein Thread steht und wartet eine Sekunde). Die Zeitabweichung bleibt aber immer noch. Gruß oki |
Re: Timer viel zu ungenau?
Ich würde da auch keinen Timer nehmen, ein Thread wäre da bestimmt besser.
Kannst ja zb mal auf Luckies Seite oder delphi-source.de kucken, da werden Threads zb erklärt. |
Re: Timer viel zu ungenau?
hi,
das genauste was ich bis jetzt kenne ist QueryPerformanceCounter in Verbindung mit QueryPerformanceFrequency... Frag mich aber nicht wie man das benutzt :? |
Re: Timer viel zu ungenau?
Ich glaube TeeBee's Posting ist nicht richtig verstanden worden.
Das Problem mit der Ungenauigkeit ist nicht das der Timer zu ungenau ist sondern das sich diese kleinen Abweichungen bei deiner Methode summieren. Das Problem liegt also in deiner Logik. Definiere eine globale Variabl Starttime: DWord := FetTickcount. BNun aktivierst du den Timer und jedesmal wenn das Event eintriffst berechnest du OnlineTime := CurrentTime - StartTime. Somit ist das Interval und die Genauigkeit des Timer egal, da nun die Onlinezeit vom Startzeitpunkt bis zum aktuelle Zeitpunkt gemessen wird. Deren genauigkeit liegt bei GetTickCount dann im Milisekunden Bereich. Gruß Hagen |
Re: Timer viel zu ungenau?
Hallo,
QueryPerformanceCounter benutzt man wie folgt:
Delphi-Quellcode:
Var
c, t1, t2 : int64; i : integer; begin QueryPerformanceFrequency(c); QueryPerformanceCounter(t1); { hier die zu messende Aktion } QueryPerformanceCounter(t2); i := 1000000 *(t2 -t1) div c; ShowMessage(IntToStr(i) +' Mikrosekunden'); end; |
Das genügt!
Hallo Freunde,
danke für die ganzen Tipps, ich mach s jetzt am besten mit der Onlinetime := now - Starttime :dancer: MfG Lefko. :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz