AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timer viel zu ungenau?

Ein Thema von Lefko · begonnen am 4. Aug 2003 · letzter Beitrag vom 15. Aug 2003
Antwort Antwort
Seite 1 von 3  1 23      
Lefko

Registriert seit: 31. Jul 2003
359 Beiträge
 
Delphi 6 Enterprise
 
#1

Timer viel zu ungenau?

  Alt 4. Aug 2003, 16:19
Hallo Freunde,

endlich funktioniert mein Kostenzähler mit automatischer Verbindungserkennung!
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

Hoffe, ihr könnt mir helfen!

MfG Lefko.

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]
Johannes
-=[Nennst du meinen Namen, bin ich schon nicht mehr da]=-
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#2

Re: Timer viel zu ungenau?

  Alt 4. Aug 2003, 16:36
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
  Mit Zitat antworten Zitat
Benutzerbild von flomei
flomei

Registriert seit: 17. Jan 2003
Ort: Schieder-Schwalenberg
2.094 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Timer viel zu ungenau?

  Alt 4. Aug 2003, 17:56
Oder du machst da irgendwas mit
sleep(1000); D.h. der Rechner wartet 1s mit deiner Schleife oder so. Ich denke, dass das etwas genauer ist.

MfG Florian
Florian Meier
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#4

Re: Timer viel zu ungenau?

  Alt 5. Aug 2003, 07:57
Zitat von flomei:
Oder du machst da irgendwas mit
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Timer viel zu ungenau?

  Alt 5. Aug 2003, 09:21
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
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#6

Re: Timer viel zu ungenau?

  Alt 5. Aug 2003, 10:07
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.
Alexander
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Timer viel zu ungenau?

  Alt 7. Aug 2003, 23:06
hi,
das genauste was ich bis jetzt kenne ist QueryPerformanceCounter in Verbindung mit QueryPerformanceFrequency... Frag mich aber nicht wie man das benutzt
Christian
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

Re: Timer viel zu ungenau?

  Alt 7. Aug 2003, 23:38
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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Timer viel zu ungenau?

  Alt 7. Aug 2003, 23:55
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;
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Lefko

Registriert seit: 31. Jul 2003
359 Beiträge
 
Delphi 6 Enterprise
 
#10

Das genügt!

  Alt 8. Aug 2003, 00:10
Hallo Freunde,

danke für die ganzen Tipps, ich mach s jetzt am besten mit der Onlinetime := now - Starttime

MfG Lefko.
Johannes
-=[Nennst du meinen Namen, bin ich schon nicht mehr da]=-
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.
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