![]() |
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 ( ![]() Vielen Dank |
Re: Timer mit Auflösung 1ms
Hi,
der DXTimer von den DelphiX-Komponenten |
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.
|
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:
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? |
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] |
Re: Timer mit Auflösung 1ms
Zitat:
|
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
![]() |
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? |
Re: Timer mit Auflösung 1ms
Zitat:
![]() ![]() 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