Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Timer mit Auflösung 1ms (https://www.delphipraxis.net/44845-timer-mit-aufloesung-1ms.html)

zarquon 25. Apr 2005 18:34


Timer mit Auflösung 1ms
 
Hallo,

wahrscheinlich ist die Lösung für mein Problem sehr trivial, aber ich bin bisher nicht darauf gekommen. ich habe schon in einigen anderen Sprachen programmiert, aber gerade erst mit Delphi angefangen.

ich brauche einen Timer unter Delphi 7 mit möglichst hoher zeitlicher Auflösung, optimalerweise 1ms. Meine Experimente mit dem TTimer haben gezeigt, das auch bei "Interval=1" die Auflösung bei ca. 16ms liegt.

Mit dem kommerziellen "Hi-Time" von Mabry (http://www.mabry.com/) komme ich auf ca. 4ms, das ist schonmal ein bedeutender Fortschritt. Im endeffekt würde mir das reichen, aber vielleicht gibt es ja einen freeware-komponenten, der das gleiche leistet? Ich will nämlich eigentlich nicht 70$ für eine nur teilweise zufriedenstellende lösung zahlen.

Vielen Dank

Die Muhkuh 25. Apr 2005 18:37

Re: Timer mit Auflösung 1ms
 
Hi,

der DXTimer von den DelphiX-Komponenten

SirThornberry 25. Apr 2005 18:37

Re: Timer mit Auflösung 1ms
 
Grund: Windows ist Multitasking, das heißt auch Andere Anwendungen bekommen Rechenzeit zugesprochen. Deshalb bekommt dein Programm bei normaler Priorität nur ca. alle 20 (16) Sekunden Rechenzeit zugeteilt. Wenn du die Priorität deines Hauptthreads erhöhst so sollte der normale Timer auch geringere Intervalle schaffen. Ähnlich/Gleich funktionieren auch die Hi-Timer, sie laufen zumeist in einem Thread mit höherer Priorität.

yankee 25. Apr 2005 19:33

Re: Timer mit Auflösung 1ms
 
Hee, ich habe doch mal gelesen, dass man den Prozessor nur maximal 18,7 mal pro sekunde nach der Zeit fragen kann...
Ist das jetzt Blödsinn, oder lässt sich das mit dem hier genannten Problem irgendwie in Verbindung bringen?
Zitat:

Zitat von SirThornberry
Deshalb bekommt dein Programm bei normaler Priorität nur ca. alle 20 (16) Sekunden Rechenzeit zugeteilt.

Sry, das kommt mir komisch vor. Schließlich kann ein Prozess auch 100% Rechenleistung bekommen...
ich glaube ich verstehe dich jetzt miß, weil, so wie ich das verstehe, würde dann ja in jedem programm nur alle 20 Sekunden etwas passieren...
Erklärst du mir das?

SirThornberry 25. Apr 2005 19:36

Re: Timer mit Auflösung 1ms
 
wenn ein Programm 100% rechleistung hat liegt das auch daran wenn andere Programme ihre Rechenzeit abgeben weil sie nix zu tun haben. Am besten du sucht bei google mal nach "zeitscheiben" und/oder "multithreading" etc. da wurde das zu 100% schon irgendwo perfekt erklärt.

[Edit]
Ahhh, jetzt versteh ichs endlich, soll natürlich Millisekunden heißen :oops:
[/Edit]

jfheins 25. Apr 2005 19:36

Re: Timer mit Auflösung 1ms
 
Zitat:

Zitat von yankee
Zitat:

Zitat von SirThornberry
Deshalb bekommt dein Programm bei normaler Priorität nur ca. alle 20 (16) Sekunden Rechenzeit zugeteilt.

würde dann ja in jedem programm nur alle 20 Sekunden etwas passieren...
Erklärst du mir das?

Millisekunden natürlich, aber deine letzte Aussage stimmt (wenn mit Millisekunden)

Luckie 25. Apr 2005 20:40

Re: Timer mit Auflösung 1ms
 
Wozu brauchst du eine so hohe Auflösung? Eventuell findet sich ja eine bessere Lösung? Ich denke da an Threads und speziell an MSDN-Library durchsuchenCreateTimerQueueTimer.

zarquon 26. Apr 2005 13:15

Re: Timer mit Auflösung 1ms
 
Danke für die zahlreichen Antworten, ich werde auf jeden Fall den erwähnten DX-Timer ausprobieren. Ich hab mir schon gedacht, das es mit der Priorität des Thread zu tun haben könnte.

Das Programm liest Werte einer Analog-Digital-Konverterkarte für ein wissenschaftliches Experiment aus, bisher ca. 60 Messwerte pro Sekunde (also alle 16ms). Das ist gerade so die untere Grenze. Schön wären 100 Werte/Sek, mehr wäre nett, muss aber auch nicht sein.
Der Hi-Timer gibt mir im optimalen Fall ca. 240 Werte/Sek, allerdings hab dann ein Problem in der Log-Datei: Dort werden die Werte über "FormatDateTime('hh:mm:ss.zzz', GetTime)" geschrieben, aber die Millisekunden stimmen nicht. Es werden immer drei oder vier Messwerte zu genau dem selben ms-Wert geschrieben.

Anscheinend läuft die interne Uhr auch nur mit einer 16ms auflösung.
Allerdings habe ich mir dazu schon überlegt, den genauen ms-wert auch aus dem Timer zu ermitteln, entweder durch einen gut gewählten Intervall-Wert oder durch eine selbstkalibrierung (Ich warte mit der Systemuhr genau 1s und schaue, wieviele Events der Timer geliefert hat)

Klingt das irgendwie sinnvoll? Oder ist das von-hinten-durch-die-Brust-ins-Auge gedacht?

Basilikum 26. Apr 2005 13:33

Re: Timer mit Auflösung 1ms
 
Zitat:

Zitat von zarquon
Allerdings habe ich mir dazu schon überlegt, den genauen ms-wert auch aus dem Timer zu ermitteln, entweder durch einen gut gewählten Intervall-Wert oder durch eine selbstkalibrierung (Ich warte mit der Systemuhr genau 1s und schaue, wieviele Events der Timer geliefert hat)

die "genauste" Zeit, die Deine PC-Hardware liefern kann, erhältst Du per API MSDN-Library durchsuchenQueryPerformanceFrequency / MSDN-Library durchsuchenQueryPerformanceCounter.

Beispiel:
Delphi-Quellcode:
Var
  Freq,
  PerfCount                      : Int64;
Begin
  QueryPerformanceFrequency(Freq); // Ticks per Sekunde

  For X:=1 TO 10000 Do Begin
    QueryPerformanceCounter(PerfCount);

    WriteLn(FormatFloat('0.0',PerfCount / Freq * 1000)); // * 1000 => Millisekunden
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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-2025 by Thomas Breitkreuz