2017-03-27 6 views
0

Sogar dort sind viele Fragen und Antworten über Datum Zeit, die ich nicht finden konnte, was ich suche. Lassen Sie mich mein Problem erklären Ich habe ein Choronometer mit Timer (Intervall 10ms) als "Zaman" erstellt, aber mein Progroam kompiliert es nicht so schnell wie Echtzeit-Chronometer.Es gibt kein relaible Ergebnis (das ist auch ein Problem). Daher möchte ich die Date Time Funktion als Chronometer benutzen, aber es gibt ein Problem: Ich konnte sie nicht von 00: 00: 00.00 (hh: mm: ss.ff) starten. Ich wollte es tun, weil durch die Verwendung von Zeitdaten Programm zeichnen Echtzeitdaten und für jede Messung muss es von Null bis zum Ende der Messung (verstrichene Zeit) beginnen. Hier ist mein Code etwa mit Timer (nicht relaible) .Can Sie helfen, wie kann es genauer machen oder wie date.time.now beginnt von 00: 00: 00.00?
salise = miliseconds, saniye = Sekunden, dakika = MinutenDatum Zeit als Choronometer

private void zaman_Tick(object sender, EventArgs e) 
    { 
      salise = Convert.ToInt32(lblsalise.Text); 
      if (salise < 99) 
      { 
       lblsalise.Text = Convert.ToString(salise + 1); 
      } 
      else 
      { 
       lblsalise.Text = "00"; 
       saniye = Convert.ToInt32(lblsaniye.Text); 
       if (saniye < 59) 
       { 
        lblsaniye.Text = Convert.ToString(saniye + 1); 
       } 
       else 
       { 
        lblsaniye.Text = "00"; 
        dakika = Convert.ToInt32(lbldakika.Text); 
        if (dakika < 59) 
        { 
         lbldakika.Text = Convert.ToString(dakika + 1); 
        } 
        else 
        { 
         lbldakika.Text = "00"; 
        } 
       } 
      } 
      lblzaman.Text = lbldakika.Text + ":" + lblsaniye.Text + ":" + lblsalise.Text; 



     } 
+6

Verwenden 'Stopwatch' statt. Das ist speziell für die Messung einer verstrichenen Zeit ausgelegt. Abgesehen von diesem Rat, ich fürchte, ich habe den Rest Ihrer Frage nicht verstanden ... –

+0

Was soll dieser Code tun? Es zeigt nur String-Manipulationen. Wo ist die aktuelle Zeit? Versuchen Sie den * Label-Text * zu verwenden, um Stunden und Minuten zu berechnen und zu speichern, anstatt 'DateTime.Now' zu verwenden? –

+0

@Jodrell wird dies in diesem Fall überhaupt nicht helfen. Der Code versucht nicht, die aktuelle Zeit überhaupt zu erhalten. Es versucht, Beschriftungen zu analysieren und zu inkrementieren. –

Antwort

2

Alle Timer sind verzerrt, was bedeutet, dass der Versuch, zu berechnen verstrichene Zeit durch Inkrementieren von Sekunden und Minuten führt zu einem ungültigen Wert an einem bestimmten Punkt.

Anwendungen verwenden die Klasse Stopwatch, um die verstrichene Zeit zu messen. Diese Klasse zählt nichts. Wenn es beginnt, speichert es den Wert a high resolution performance counter in Ticks. Wenn Sie die Zeit Elapsed anfordern, ruft es die aktuelle Betriebszeit ab und berechnet die Differenz.

Danach werden die Etiketten Einstellung ist nur eine Frage der Formatierung der Wert Timespan von der Unterkunft Elapsed zurückgegeben, zB:

Stopwatch _watch=new Stopwatch(); 

public void Start() 
{ 
    _watch.Start(); 
} 

private void zaman_Tick(object sender, EventArgs e) 
{ 
    var time=_watch.Elapsed; 
    lblFull.Text = time.ToString(@"hh\:mm\:ss\.ff"); 
    lblHours.Text= time.ToString(@"hh"); 
    lblMinutes.Text= time.ToString(@"mm"); 
    lblSecs.Text= time.ToString(@"ss"); 
    lblMs.Text= time.ToString(@"ff"); 
} 
1

Ich glaube, Sie mit so etwas besser dran, ein Stopwatch,

var stopwatch = System.Diagnotics.Stopwatch.StartNew(); 

private void zaman_Tick(object sender, EventArgs e) 
{ 
    lblzaman.Text = stopwatch.Elapsed.ToString(); 
} 

Der Wert von Stopwatch.Elapsed verwendet, ist ein TimeSpan, dass kann formatted in many different ways sein, siehe @Panagiotis's answer für einige Beispiele.


Wenn Sie lblzaman in genauen Abständen aktualisiert möchten, dann sollten Sie mit System.Timers.Timer oder vielleicht, System.Threading.Timer als Ereignisquelle untersuchen, auf einem Hintergrund-Thread, aber denken Sie daran, die Sie benötigen Cross-Thread-Anrufe auf die zu handhaben Benutzeroberfläche aktualisieren