2016-02-26 16 views
2

当我按下按钮1时,tabatas的值立即从8变为1然后timer1_tick方法正确运行一次。多次呼叫定时器有奇怪的结果

int goSecondsLeft = 20; 
    int restSecondsLeft = 10; 
    int tabatas = 8; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 

     if (goSecondsLeft >= 0) 
     { 
      lbGoOrRest.Text = "Go!"; 
      lbSecondsRemaining.Text = goSecondsLeft.ToString() + " seconds"; 
      goSecondsLeft--; 
     } 
     else if (restSecondsLeft >= 0) 
     { 
      lbGoOrRest.Text = "Rest"; 
      lbSecondsRemaining.Text = restSecondsLeft.ToString() + " seconds"; 
      restSecondsLeft--; 
     } 
     else 
     { 
      timerGo.Stop(); 

     } 

    }  

    private void button1_Click(object sender, EventArgs e) 
    { 
     while (tabatas > 0) 
     { 
      lbTabatasRemaining.Text = "Tabatas remaining" + tabatas.ToString(); 
      timerGo.Start(); 
      tabatas--; 
     } 
    } 

我把一个破发点的线,而(tabataas> 0),并在steping在每个while循环执行畑的值时下降一个预期,但是当我运行它,它去在timer1_tick方法继续运行的同时立即执行1。

我的工作下面的代码:

  else 
     { 
      goSecondsLeft = 20; 
      restSecondsLeft = 10; 
      tabatas--; 
      lbTabatasRemaining.Text = "Tabatas remaining" + tabatas.ToString(); 
      timerGo.Stop(); 
     } 

    }  

    private void button1_Click(object sender, EventArgs e) 
    { 
      timerGo.Start(); 
    } 
+0

可能是一个线程相关的问题。 –

+0

为什么重新启动循环中的定时器?另外,定时器的间隔是多少? – Gusman

+0

间隔是1000ms,我想让time1Tick方法中的代码执行8次。 –

回答

3

while循环中有没有引起延迟,所以它贯穿几乎在瞬间完成。也许你认为Timer.Start阻塞了一段时间,但事实并非如此。它只是在后台启动计时器并立即返回。

不知道你到底想要做什么,但是如果你想让tabatas变量沿着这个时间点滴下来,取而代之的是取消循环并递减定时器事件处理程序中的变量。

+0

我试着减少tick处理程序中的tabata变量,但我不知道如何做它只有一次它似乎发生每个滴答。 –

+0

我猜这是间隔计时器。你应该在你的代码中有一个地方,当你的“休息”阶段结束时,将你的休息/休息计数器重置为最大值 - 可能会减少它? –

+0

是的,我更改了else语句中的代码来重置变量并减少tabata变量,它完全可以工作。 –