2017-05-11 3 views
-2

Ich habe eine Frage zu Windows-Formularen. Ich habe diesen Countdown gemacht, der auf dem Code und den Bildern unten zu sehen ist. Ich habe ein Problem damit. Wenn ich den ersten Countdown mit Start und Stopp starte, läuft es so, wie es sollte, mit Stunden, Minuten und Sekunden, aber sobald ich den zweiten Countdown starte, setzt der erste die Werte auf die Werte zurück, die in den zweiten eingegeben wurden. Und es überspringt eine Sekunde bei beiden. Also geht es von Sekunde 53 auf 51 auf der ersten und von 52 auf 50 auf der anderen Seite. Hat jemand von euch irgendwelche Ideen, wie man dieses Problem löst und sie unabhängig macht von einander, die sie jetzt eindeutig sind ??Mehrere Timer scheint nicht auf Windows-Formulare zu arbeiten?

Vielen Dank im Voraus!

namespace newtime 
{ 
    public partial class Form1 : Form 
    { 
     private int h; 
     private int m; 
     private int s; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnStart1_Click(object sender, EventArgs e) 
     { 

      if (textBox1.Text == "") 
      { 
       textBox1.Text = "0"; 
      } 
      if (textBox2.Text == "") 
      { 
       textBox2.Text = "0"; 
      } 
      if (textBox3.Text == "") 
      { 
       textBox3.Text = "0"; 
      } 

      h = Convert.ToInt32(textBox1.Text); 
      m = Convert.ToInt32(textBox2.Text); 
      s = Convert.ToInt32(textBox3.Text); 
      timer1.Start(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      s = s - 1; 
      if (s == -1) 
      { 
       m = m - 1; 
       s = 59; 
      } 
      if (m == -1) 
      { 
       h = h - 1; 
       m = 59; 
      } 
      if (h == 0 && m == 0 && s == 0) 
      { 
       timer1.Stop(); 
       MessageBox.Show("Times up!", "Timer"); 
      } 
      string hh = Convert.ToString(h); 
      string mm = Convert.ToString(m); 
      string ss = Convert.ToString(s); 
      textBox1.Text = hh; 
      textBox2.Text = mm; 
      textBox3.Text = ss; 
     } 

     private void btnStop1_Click(object sender, EventArgs e) 
     { 
      timer1.Stop(); 
     } 

     private void btnStart2_Click(object sender, EventArgs e) 
     { 

      if (textBox4.Text == "") 
      { 
       textBox4.Text = "0"; 
      } 
      if (textBox5.Text == "") 
      { 
       textBox5.Text = "0"; 
      } 
      if (textBox6.Text == "") 
      { 
       textBox6.Text = "0"; 
      } 
      h = Convert.ToInt32(textBox4.Text); 
      m = Convert.ToInt32(textBox5.Text); 
      s = Convert.ToInt32(textBox6.Text); 
      timer2.Start(); 
     } 

     private void timer2_Tick(object sender, EventArgs e) 
     { 
      s = s - 1; 
      if (s == -1) 
      { 
       m = m - 1; 
       s = 59; 
      } 

      if (m == -1) 
      { 
       h = h - 1; 
       m = 59; 
      } 

      if (h == 0 && m == 0 && s == 0) 
      { 
       timer2.Stop(); 
       MessageBox.Show("Times up!", "Timer"); 
      } 

      string hh = Convert.ToString(h); 
      string mm = Convert.ToString(m); 
      string ss = Convert.ToString(s); 
      textBox4.Text = hh; 
      textBox5.Text = mm; 
      textBox6.Text = ss; 
     } 

     private void btnStop2_Click(object sender, EventArgs e) 
     { 
      timer2.Stop(); 
     } 
    } 
} 

enter image description here

enter image description here

+6

Sie haben zwei Timer, aber Sie haben nur einen Satz 'h',' m', 's' Variablen, die Sie ständig überschreiben – Adrian

+1

Dies ist, wo Sie den Debugger verwenden müssen und Schritt durch Ihren Code haben Sie don 't that part mindest .. – MethodMan

+0

Immer wenn Sie sehen, sich Code wie das zu wiederholen, sollten Sie sofort denken "Ich brauche wahrscheinlich eine Klasse". Ein UserControl funktioniert hier gut. –

Antwort

1

Wie die anderen Plakate darauf hingewiesen haben, können Sie nur eine Kopie von h haben, m und s, die von allen Timer Event-Handler gemeinsam genutzt werden. Das bedeutet, dass sie die Arbeit der anderen überschreiben werden, wie Sie gerade sehen. Die offensichtliche Lösung besteht darin, für jeden Timer eine andere Kopie von h, m und s zu erstellen.

Ich möchte jedoch darauf hinweisen, dass Sie dieses Problem nur mit einem Timer lösen können. Das Programm muss nur die Zeit aufzeichnen (erhalten von System.DateTime.Now), wenn der Benutzer auf jeden "Start" -Button klickt und ihn in einer Variablen speichert (eine für jede Timer-Anzeige). Dann muss der Unterschied zwischen der aktuellen Zeit und der (gespeicherten) Startzeit für jeden fortlaufend berechnet werden. Das laufende Verhalten könnte durch einen einzigen Timer und eine Schleife ausgelöst werden.

Es ist am besten zu vermeiden, dass in Ihrer Anwendung viele verschiedene Timer laufen, denn dann müssen Sie sich darum kümmern, jedes einzeln zu starten, anzuhalten und zu entsorgen.

Hier ist ein grober Entwurf, um Ihnen die Idee zu geben, es kann ein Tweak oder zwei zu kompilieren brauchen.

struct TimerStatus 
{ 
    DateTime StartTime; 
    bool IsRunning; 
} 

TimerStatus[] _timers = new TimerStatus[10]; 


void Start1_Click() 
{ 
    _timers[1].StartTime = System.DateTime.Now; 
    _timers[1].IsRunning = true; 
} 

void Stop1_Click() 
{ 
    _timers[1].IsRunning = false; 
} 

void Start2_Click() 
{ 
    _timers[2].StartTime = System.DateTime.Now; 
    _timers[2].IsRunning = true; 
} 

void Stop2_Click() 
{ 
    _timers[2].IsRunning = false; 
} 

void OneAndOnlyTimer_Tick() 
{ 
    for (int i=0; i<=_timers.GetUpperBound(0); i++) 
    { 
     if (_timers[i].IsActive) 
     { 
      TimeSpan ts = System.DateTime.Now - _timers[i].StartTime; 
      DisplayTimer(i, ts.Hours, ts.Minutes, ts.Seconds); //You will need to write the method that does the display 
     } 
    } 
} 

Für zusätzliche Kredite verwenden Sie könnten sogar die gleiche Click-Handler für alle Tasten (Sie können den Array-Index identifizieren die Tag Eigenschaft Kontrolle verwendet wird). Aber das ist außerhalb des Rahmens meiner Antwort.

Verwandte Themen