Timer ist ungenau

Danielku15

Erfahrenes Mitglied
Hi Leute.

Ich habe einen Countdown-Timer erstellt. Der User kann in Textfelder die Stunden, Minuten und Sekunden eingeben welche der Countdown ablaufen soll. Zudem Gibt es Textfelder in welchen er eine Uhrzeit eingeben kann.

Beispiel:
CountdownZeit: 00:00:10 --> 10 Sekunden
StartZeit: 11:06:30 --> Uhrzeit.

Jetzt soll der Timer um diese Uhrzeit beginnen zu zählen.
Ich habe eine TimeChecker-Timer mit einem Interval von 1.
Beim Tick Event wird über DateTime.Compare verglichen ob die StartZeit <= der Jetzigen Zeit ist (Dann ist die Zeit eingetroffen). Funktioniert auch. Nur Ich habe darunter eine Uhr positioniert. Nur ist der Countdown langsamer als die Uhr. Die Uhr funktioniert genau so über einen Timer mit einem Interval von 1. Warum ist hier ein Unterschied vorhanden. Denn der Countdown sollte im Beispiel dann um 11:06:40 enden.

Liegt dies an der Verarbeitung der Methoden oder muss ich da einzelne Threads starten dass der Countdown und die Uhr synchron sind?

gruß Daniel
 
Hi

Es hängt erstens davon ab, welchen Timer du nutzt. Die Timer-Klasse aus dem Namespace System.Windows.Forms läuft im Thread in dem die Form läuft. Du du einen sehr kleinen Interval hast und zudem 2 Timer laufen, erzeugen die ziemlich viel Prozessorlast in diesem Thread.

Anders hingegen die Klassen Timer aus dem Namespace System.Threading. Diese läuft in einem extra Thread.

Zudem würde ich Interval für den Countdown-Timer auf 1 sec einstellen, da deine Voreinstellung auch nur Sekundengenau ist. Damit könntest du die Last schon mal minimieren.

Was verstehst du aber unter "läuft langsamer"? Wie weit liegt denn das erwartete Ergebnis vom tatsächlichen entfernt?
 
Das Interval hatte ich davor auf 100. Hatte es wohl zum Testen auf 1 heruntegesetzt.

Also Hier mal der Aufbau:

DigitalClock.cs --> Mit einem System.Windows.Forms.Timer mit dem Interval von 100 und diese Aktionen beim beim Tick auslöst:

C#:
        private void tmClock_Tick(object sender, EventArgs e)
        {
            if (sender == tmClock)
            {
                labClock.Text = GetTime();
                Invalidate();
            }
        }

        public string GetTime()
        {
            string sZeit = "";

            // Zeit holen
            int iStunden = DateTime.Now.Hour;
            int iMinuten = DateTime.Now.Minute;
            int iSekunden = DateTime.Now.Second;

            // im Format HH:MM:SS Setzen
            sZeit = (iStunden < 10) ? "0" + iStunden.ToString() : iStunden.ToString();
            sZeit += ":" + ((iMinuten < 10) ? "0" + iMinuten.ToString() : iMinuten.ToString());
            sZeit += ":" + ((iSekunden < 10) ? "0" + iSekunden.ToString() : iSekunden.ToString());

            return sZeit;
        }

AnalogClock.cs --> Mit einem System.Windows.Forms.Timer mit dem Interval von 100 und diese Aktionen beim beim Tick auslöst:

C#:
private void tmTimeGetter_Tick(object sender, EventArgs e)
        {
            this.Time = DateTime.Now;
        }

Bei der Time-Eigenschaft wird darauf ein Invalidate ausgelöst. Beim OnPaint wird dann eine Analoge Uhr gezeichnet.

MainForm.cs --> Hat 2 System.Windows.Forms.Timer mit dem Intervall von 100. 1 Für das Überprüfen ob eine bestimmte Zeit erreicht wurde. Und 1 um den Countdown zu zählen.

Ich kann bei Bedarf auch das Projekt uploaden. Aber ich denke dies sind die Haupt-Funktionen die das Programm ausmachen. Ich hoffe ihr findet den Fehler.

Gruß Daniel.
 

Anhänge

  • CountDown.zip
    9,3 KB · Aufrufe: 18
Hi

Wieviele Timer sind es denn nun? :confused:
2 oder 4?
Lad doch bitte das Projekt hoch, die Exe ist beim Suchen der Ursache bzw. Lösung wenig hilfreich.

Probier die Timer-Klasse aus dem Namespace System.Threading aus. Da sie einen eigenen Thread nutzt könnte dir das vielleicht schon weiterhelfen.
 
Im ganzen Projekt sind es 4 Timer.

Ich habe 2 Uhren-Komponenten. Eine Analoge und eine Digitale. Und in diesen Komponenten sind natürlich jeweils 1 Timer enthalten um die Zeitanzeige zu aktualisieren.
Im Hauptfenster sind nochmals 2 Timer um einmal den Countdown herunterzuzählen und einmal um zu überprüfen ob die gewünschte Startzeit erreicht ist.

Das Projekt ist angehängt.
 

Anhänge

  • CountDownTimer.zip
    77,1 KB · Aufrufe: 15
Zurück