Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Timer viel zu ungenau? (https://www.delphipraxis.net/7172-timer-viel-zu-ungenau.html)

Lefko 4. Aug 2003 15:19


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]

teebee 4. Aug 2003 15:36

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

flomei 4. Aug 2003 16:56

Re: Timer viel zu ungenau?
 
Oder du machst da irgendwas mit
Delphi-Quellcode:
sleep(1000);
D.h. der Rechner wartet 1s mit deiner Schleife oder so. Ich denke, dass das etwas genauer ist.

MfG Florian :hi:

teebee 5. Aug 2003 06:57

Re: Timer viel zu ungenau?
 
Zitat:

Zitat von flomei
Oder du machst da irgendwas mit
Delphi-Quellcode:
sleep(1000);
D.h. der Rechner wartet 1s mit deiner Schleife oder so. Ich denke, dass das etwas genauer ist.

Damit beschäftigtst Du Dein Programm komplett mit dem Anzeigen der Zeit und kannst auf nix anderes reagieren. (Falls Du zwischendurch die Nahchrichtenschleife abarbeitest, kannst Du die Sekunde wieder vergessen...)

Gruss, teebee

oki 5. Aug 2003 08:21

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

Alexander 5. Aug 2003 09:07

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.

Basic-Master 7. Aug 2003 22:06

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 :?

negaH 7. Aug 2003 22:38

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

MrSpock 7. Aug 2003 22:55

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;

Lefko 7. Aug 2003 23:10

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 04:16 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz