Laden...

Timer mit höherer Auflösung als 15ms

Erstellt von schnelleHelga vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.153 Views
schnelleHelga Themenstarter:in
82 Beiträge seit 2014
vor 9 Jahren
Timer mit höherer Auflösung als 15ms

Hallo,

ich habe eigentlich nur eine Frage zu den Timern. Mit ist beim Testlauf für ein Projekt gerade etwas seltsames passiert. Ich habe 4 Timer mit unterschiedlichen Zeiten im Bereich zwischen 45 und 100 ms. Dabei habe ich festgestellt, dass die beiden mit 65ms und 75ms in dem Test syncron laufen. Die Tick-Ereignisse der beiden Timer werden auch über einen längeren Zeitraum (Minuten) immer zur gleichen Zeit ausgelöst. Bei Intervallen über 100ms trat der Effekt nicht auf.
Das es Abweichungen und Gleichlaufprobleme bei kleinen Intervallen gibt, ist bekannt.
Bei Änderung von 75ms auf 79ms läuft alles prima.

Die Timer sind wie folgt initialisiert:

using System;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;

namespace auto2
{
    public partial class Form1 : Form
    {
        Timer b1,b2,b3,b4;
        int[] x1;
        int[] y1;
        int k1,k2,k3,k4;
        int x2, y2;
        int rundemax;

        public Form1()
        {
            InitializeComponent();
            b1 = new Timer();
            b1.Enabled = true;
            b1.Stop();
            b1.Interval = 100;
            b1.Tick += b1_Tick;
            b2=new Timer();
            b2.Enabled=true;
            b2.Stop();
            b2.Interval = 75;
            b2.Tick += b2_Tick;
            b3 = new Timer();
            b3.Interval = 65;
            b3.Enabled = true;
            b3.Stop();
            b3.Tick += b3_Tick;
            b4 = new Timer();
            b4.Interval = 45;
            b4.Enabled = true;
            b4.Stop();
            b4.Tick += b4_Tick;

            x1 = new int[2400];
            y1 = new int[2400];

Auf Schönheit wurde wegen Testlauf kein Wert gelegt. Mir geht es nur um diesen Syncron-Effekt.

Schon mal Danke für eventuelle Ideen.

schnelleHelga

Hinweis von Coffeebean vor 9 Jahren

Bitte benutze Code-Tags! [Hinweis] Wie poste ich richtig? Punkt 6

P
1.090 Beiträge seit 2011
vor 9 Jahren

Google hat zu tage gebracht das die Genauigkeit beim Timer so um die 15ms liegt (je nach System).
Da scheinen die 65 und 75ms im selben "Tick" zu liegen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

schnelleHelga Themenstarter:in
82 Beiträge seit 2014
vor 9 Jahren

Würde also bedeuten, Schritte von mindestens 15ms. Für kritische Anwendungen demnach unbrauchbar. man müsste das mal testen, beii welchen Bereichen noch eine Übereinstimmung zu Stande kommt.

schnelleHelga

R
228 Beiträge seit 2013
vor 9 Jahren

Ohne das jetzt getestet zu haben, wie genau ist denn Task.delay?

Sollte ja nicht so aufwendig zu sein eine Klasse zu schreiben die z.B. eine Action entgegen nimmt und ne Methode Start/Stop hat und eine mit einer Schleife:


do{
   Action();
   await Task.delay(Timer).ConfigureAwait(false);
}
while(isStarted)

P
1.090 Beiträge seit 2011
vor 9 Jahren

Schau dir mal den Artikel an. CodeProjekt:Microsecond and Millisecond C# Timer

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

schnelleHelga Themenstarter:in
82 Beiträge seit 2014
vor 9 Jahren

@Palin Sieht gut aus, hatte vorhin eine ähnliche Idee. ich brauche aber im Moment keine Lösung, weil kein Problem besteht. Ich nur durch Zufall auf diese Eigenheiten gestoßen, weil ich für eine Darstellung (verschieben von Controls) die später anfallenden Ereignisse mit ein paar Timer nachgestellt habe. Die Ereignisse sind zur Zeit noch nicht verfügbar. Bei Fertigstellung ist im Projekt nur ein Timer mit etwa 1s enthalten, der zudem auch unkritisch ist.

für alle, die es interessiert sind hier die tatsächlichen Zeiten auf meinem System:


Interval      gemessene ms
 1 - 15                15
 16                     26
 17 - 31              31
 32                     39
 33 - 46              46
 47                     52
 48 -62               62
 63 - 78              78
 79 - 93              93
 94                     104
 95 -                   109

Auffallend sind die Ergebnisse bei 16, 32, 47, 94

Soweit ich mich an meine Hardware-Ära erinnern kann, werden die Systemtimer von der Systemuhr abgeleitet. Daran dürfte sich bis heute nichts geändert haben. Diese Uhr wird mit 32768Hz betrieben, was keine genauen Millisekunden liefern kann.
Je nachdem, welche Software und Hardware für die Timer eingesetzt werden, gibt es eben diese groben Schrittweiten.

schnelleHelga

1.040 Beiträge seit 2007
vor 9 Jahren
...  
            b1.Enabled = true;  
            b1.Stop();  
...  

Nur kurz: Enabled = true entspricht Start(), Stop() entspricht Enabled = false. Da die Timer standardmäßig Enabled = false sind, sind diese Zeilen überflüssig.

5.658 Beiträge seit 2006
vor 9 Jahren

Hi schnelleHelga,

weil ich für eine Darstellung (verschieben von Controls)

Möglicherweise versuchst du, mit Kanonen auf Spatzen zu schießen. Für die Animation von Elementen der GUI gibt es bereits fertige Bibliotheken. Selbst wenn du es selbst programmieren willst, brauchst es nicht genauer zu sein, als es der Bildschirm darstellen kann. In der Dokumentation zur System.Windows.Forms.Timer-Klasse steht übrigens explizit:

Die Zeitgeberkomponente in Windows Forms ist Singlethreaded und auf eine Genauigkeit von 55 Millisekunden beschränkt.

Auch die System.Timers.Timer-Klasse hat eine beschränkte Auflösung, wie auch schon ein paarmal hier im Forum besprochen wurde. Eine Zusammenfassung gibt es bei Stackoverflow: Why are .NET timers limited to 15 ms resolution?.

15 Millisekunden sollten aber für Animationszwecke ausreichend sein, das entspricht einer Framerate von 66 Hz.

Christian

Weeks of programming can save you hours of planning

16.828 Beiträge seit 2008
vor 9 Jahren

Das ist in meinen Augen nicht nur Kanonen mit Spatzen sondern auch für so eine Anforderung der hohen Auflösung womöglich auch die völlig falsche Technologie(basis).
Die Frage ist hier wirklich warum das so eine hohe Frequenz haben muss und ob wir nicht dann auch direkt in den Bereich kommen, wo Windows Forms einfach völlig ungeeignet ist, da der Fokus hier ein anderer darstellt.

schnelleHelga Themenstarter:in
82 Beiträge seit 2014
vor 9 Jahren

Nochmal kurze Wortmeldung,

bitte beachtet meinen ersten Post, mir war nur aufgefallen, dass die Timer bei kleinen Zeitunterschieden syncron laufen. Wie sich herausgestellt hat, beträgt die AUflösung/Genauigkeit etwa 15ms. Das stimmt leider auch nicht, es gibt da zwischendurch Schritte von 5, 10, 16ms usw.
Konnte ich nicht ahnen und bin durch Zufall auf das Problem gestoßen.
Meine eigentliches Projekt bekommt über eine Schnittstelle Daten und setzt diese in Bewegung um.
Funktioniert inzwischen einwandfrei.
Da ich diese Daten zum Test simulieren wollte, habe ich die 4 Timer gesetzt für das zufällige eintreffen der Daten. Das ist das Einzige was hier schiefgegangen ist.

Trotzdem Danke an Alle für die konstruktiven Hinweise.
Eventuell hilft die Erkenntnis zu Timern ja auch Anderen weiter.

schnelleHelga