[C#] Timer fängt zu langsam an...

01/23/2013 20:47 CyberSandler#1
Hey...

ich hätte für einen Freund einen "Timer" in C# schreiben sollen... alles funktioniert einwandfrei, nur wenn ich auf "Start" drücke, startet der Timer sich erst in ca. 0,5 Sekunden oder sogar einer... somit ist dann bei mir die Minute falsch... also dann kommt schon die 1. Minute bei 59 Sekunden.

Quellcode:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Timer_New
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int Sekunden = 0;
        int Minuten = 0;
        int Stunden = 0;


        private void cbSekunden_CheckedChanged(object sender, EventArgs e) // Checkboxen um eben aussuchen zu können, ob man nur Sekunden, Minuten oder Stunden auswählen will. (sehen will)
        {
            if (cbSekunden.Checked == false)
            {
                lbSekunden.Visible = false;
                cbMinuten.Enabled = false;
                lbMinuten.Visible = false;
                cbMinuten.Checked = false;
                lbDoppelpunkt2.Visible = false;
                lbDoppelpunkt.Visible = false;
                lbStunden.Visible = false;
                cbStunden.Enabled = false;
                cbStunden.Checked = false;
            }
            else
            {
                lbSekunden.Visible = true;
                cbMinuten.Enabled = true;
            }
        }

        private void cbMinuten_CheckedChanged(object sender, EventArgs e) // Checkboxen um eben aussuchen zu können, ob man nur Sekunden, Minuten oder Stunden auswählen will. (sehen will)
        {
            if (cbMinuten.Checked == false)
            {
                lbMinuten.Visible = false;
                lbDoppelpunkt2.Visible = false;
                lbDoppelpunkt.Visible = false;
                lbStunden.Visible = false;
                cbStunden.Enabled = false;
                cbStunden.Checked = false;
            }
            else
            {
                lbMinuten.Visible = true;
                lbDoppelpunkt2.Visible = true;
                cbStunden.Enabled = true;
            }
        }

        private void cbStunden_CheckedChanged(object sender, EventArgs e) // Checkboxen um eben aussuchen zu können, ob man nur Sekunden, Minuten oder Stunden auswählen will. (sehen will)
        {
            if (cbStunden.Checked == false)
            {
                lbStunden.Visible = false;
                lbDoppelpunkt.Visible = false;
            }
            else
            {
                lbStunden.Visible = true;
                lbDoppelpunkt.Visible = true;
            }
        }

        private void btnStart_Click(object sender, EventArgs e) //Start-Button, löst die Timer aus.
        {
            tSekunden.Start();
            tMinuten.Start();
            tStunden.Start();
        }

        private void btnStopp_Click(object sender, EventArgs e) //Stop-Button, stoppt die Timer.
        {
            tSekunden.Stop();
            tMinuten.Stop();
            tStunden.Stop();
        }

        private void btnReset_Click(object sender, EventArgs e) //Reset-Button,  setzt Sekunden, Minuten & Stunden auf 0, und stoppt den Timer.
        {
            tSekunden.Stop();
            tMinuten.Stop();
            tStunden.Stop();
            Sekunden = 0;
            Minuten = 0;
            Stunden = 0;
            lbSekunden.Text = Convert.ToString(Sekunden);
            lbMinuten.Text = Convert.ToString(Minuten);
            lbStunden.Text = Convert.ToString(Stunden);
        }

        private void tSekunden_Tick(object sender, EventArgs e) //Timer für die Sekunden.
        {
            Sekunden++;
            lbSekunden.Text = Convert.ToString(Sekunden);

            if (Sekunden >= 60)
            {
                Sekunden = 0;
                lbSekunden.Text = Convert.ToString(Sekunden);
            }
            else
            {

            }
        }

        private void tMinuten_Tick(object sender, EventArgs e) //Timer für die Minuten.
        {
            Minuten++;
            lbMinuten.Text = Convert.ToString(Minuten);

            if (Minuten >= 60)
            {
                Minuten = 0;
                lbMinuten.Text = Convert.ToString(Minuten);
            }
            else
            {

            }
        }

        private void tStunden_Tick(object sender, EventArgs e) //Timer für die Stunden.
        {
            Stunden++;
            lbStunden.Text = Convert.ToString(Stunden);

            if (Stunden >= 24)
            {
                tSekunden.Stop();
                tMinuten.Stop();
                tStunden.Stop();
                Sekunden = 0;
                Minuten = 0;
                Stunden = 0;
                lbSekunden.Text = Convert.ToString(Sekunden);
                lbMinuten.Text = Convert.ToString(Minuten);
                lbStunden.Text = Convert.ToString(Stunden);
            }
            else
            {

            }
        }
    }
}
Falls jemand eine Lösung hat, wie der Timer sich gleich starten kann, dann schreibt bitte! :)

Damit jeder versteht was ich damit meine...
Hier das Programm als [Only registered and activated users can see links. Click Here To Register...]
Hier der ganze Sourcecode etc. als [Only registered and activated users can see links. Click Here To Register...]
Danke schon mal im Voraus.
01/23/2013 20:50 qkuh#2
Wieso benutzt du drei Timer? Einer reicht doch.
Intervall auf 1s stellen und fertig.
01/23/2013 20:56 CyberSandler#3
Na ja... ich habe 3 Label... ich hab ihn gefragt ob ich 1 Label verwenden darf und dies sich dann ändert... er meinte eben, dass sein Professor es anders verlangt, und joa.
1 Timer - 1 Intervall...
Wenn ich nun 3 Label habe und nur einen Timer habe, dann wird ja nur ein Intervall verwendet.
und ja...

€dit : Hab das Programm zum Download freigestellt.
01/23/2013 21:07 qkuh#4
Lad mal den sourcecode hoch.
01/23/2013 21:16 CyberSandler#5
Quote:
Originally Posted by qkuh View Post
Lad mal den sourcecode hoch.
Habe ich gerade eben...

( [Only registered and activated users can see links. Click Here To Register...] )
01/23/2013 21:37 qkuh#6
[Only registered and activated users can see links. Click Here To Register...]

Hab eine Abweichung von etwa 12ms. Ist relativ viel.
Wenn man das mal 60 rechnet ist man schon bei einer Abweichung von 720ms.
Ich würde entweder mit Threads arbeiten oder das Intervall niedriger setzten und die Systemzeiten miteinander vergleichen.

Hiermit kann man auch gut arbeiten: [Only registered and activated users can see links. Click Here To Register...]
01/27/2013 01:48 MrSm!th#7
#moved
01/27/2013 15:09 nkkk#8
timer zu benutzten um die zeit zu Messen ist grosser unsinn. Benutzte die
[Only registered and activated users can see links. Click Here To Register...]