2016-04-12 27 views
0

Döngü kullanarak çoklu zamanlayıcılar oluşturdum ve zamanlayıcılar karşılık gelen etiketlere daldırıldı. Eğer "n" tuşuna basarsam, "n" zamanları oluşturulacak. Bu kod, çalışma zamanı sırasında geri sayımda hata gösteriyor. Her zamanlayıcı farklı aralıklarla azalmaktadır. Bu sorunu nasıl çözebilirim?C# windows uygulama formunda çoklu geri sayım zamanlayıcıları nasıl oluşturulur?

public Dictionary<Timer, Label> dict = new Dictionary<Timer, Label>(); 

    int n = 1; 
    int timesec = 10; 
    private void CreateTimers() 
    {       
     for (int i = 1; i <= n; i++) 
     { 

      Timer timer = new Timer(); 
      timer = new System.Windows.Forms.Timer(); 


      timer.Tick += new EventHandler(timer_Tick); 
      timer.Interval = (1000);//1 sec 

      Label label = new Label(); 
      label.Name = "label" + i; 
      label.Location = new Point(0, 100 + i * 30); 
      label.TabIndex = i; 
      label.Visible = true; 

      this.Controls.Add(label); 

      dict[timer] = label; 

      timer.Enabled = true; 
      timer.Start(); 

     } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     //function call 
     CreateTimers(); 
     n++; 
    } 
    private void timer_Tick(object sender, EventArgs e) 
    { 
     //timer countdown 
     Timer t = (Timer)sender; 
     timesec--; 
     if (timesec == 0) 
      t.Stop(); 
     dict[t].Text = timesec.ToString(); 

    } 
+0

Bize hata mesajı gösterebilir:

, aşağı böyle bir şey sayısını göstermek için etiketin değerini kullanarak deneyin? Ayrıca zamanlayıcılar arasında 'timesec 'paylaşıyorsunuz. Birden fazla zamanlayıcı kullanmanın tam olarak ne istediğini tam olarak açıklayabilir misiniz, belki de en iyi fikir değildir. – gzaxx

+0

Yalnızca bir * Timer kullanın, tek işi etiketleri güncellemektir. Aralığı özelliği kritik değil, 45 msn yeterince hızlıdır. Her etiket için, zamanlamaya başladığınızda DateTime.UtcNow değerini saklayın. Ve bunu ne zaman geçtiğini bilmek için güncellediğinizde DateTime.UtcNow öğesinden çıkarın. –

cevap

0

Birkaç sorun. Her şeyden önce, bu döngüyü ortadan kaldırmak zorundasınız, çünkü bu muhtemelen fark ettiğinizden daha fazla zamanlayıcı yaratır. Ayrıca, her bir zamanlayıcının bağımsız olmasını istediğinizden, timesec değerini değiştiremezsiniz.

private void CreateTimer() { 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
    timer.Tick += timer_Tick; 
    timer.Interval = (1000);//1 sec 

    Label label = new Label(); 
    label.Name = "label" + n.ToString(); 
    label.Text = timesec.ToString(); 
    label.Location = new Point(0, 100 + n * 30); 
    label.Visible = true; 
    this.Controls.Add(label); 

    dict.Add(timer, label); 
    timer.Enabled = true; 
    timer.Start(); 
    n++; 
} 

private void timer_Tick(object sender, EventArgs e) { 
    System.Windows.Forms.Timer t = (System.Windows.Forms.Timer)sender; 
    Label l = dict[t]; 
    int labelTime = 0; 
    if (Int32.TryParse(l.Text, out labelTime)) { 
    labelTime -= 1; 
    } 
    l.Text = labelTime.ToString(); 
    if (labelTime == 0) { 
    t.Stop(); 
    } 
} 
İlgili konular