2016-01-30 23 views
1

我一直在使用Visual Studio在C#中使用簡單的倒數計時器來在一段時間後關閉應用程序。簡單的倒計時應用程序C#不能正確顯示

但是,現在我所運行的是Windows窗體上的倒計時顯示。

我的問題是通過每個片步進時,邏輯似乎是聲音時,秒倒計時,分鐘計數關閉秒達到0等

然而,問題是在一秒之後,文本框從「剩餘1分59秒」到「剩餘1分1秒」顯示剩餘時間變化,並且似乎只是在那裏掛起,無論我讓應用程序運行多久。

我在這裏錯過了我的邏輯嗎?

謝謝大家提前。

下面是代碼:

int i_minutes = 1; 
    int i_seconds = 59; 


    public TestTimer() 
    { 
     InitializeComponent(); 
     lb_TimeRemaining.Text = String.Format("{0} minutes {1} seconds remaining", i_minutes.ToString(), i_seconds.ToString()); 
     timer1.Start(); 
    } 


    private void timer1_Tick(object sender, EventArgs e) 
    { 

     //while the timer ticks 
     while (i_seconds != 0 && i_minutes != 0) 
     { 
      //if the seconds reaches 0, subtract a minute 
      if(i_seconds == 0) 
      { 
       i_minutes = i_minutes - 1; 

       //if the minutes are still not below 0, reset the seconds to 59 
       if (i_minutes >= 0) 
       { 
        i_seconds = 59; 
       } 
      } 

      //add a zero to seconds if its below 10 
      //so it displays such as 09, 08, etc 
      if (i_seconds < 10 && i_minutes != 0) 
      { 
       lb_TimeRemaining.Text = String.Format("{0} minutes 0{1} seconds remaining", i_minutes, i_seconds); 
      } 

      //if seconds are above 10, but minutes below 0, display as 0 minutes and seconds 
      else if (i_minutes < 0) 
      { 
       lb_TimeRemaining.Text = String.Format("0 minutes {1} seconds remaining", i_minutes, i_seconds); 
      } 

      //if the minutes are above 0, and seconds above 10, display as such 
      else 
      { 
       lb_TimeRemaining.Text = String.Format("{0} minutes {1} seconds remaining", i_minutes, i_seconds); 
      } 

      i_seconds = i_seconds - 1; 
     } 
    } 
} 
+1

在if中更改您的值,並將計時器設置爲精確的1000毫秒間隔 – Steve

回答

2

此行是你的錯誤,問題是在您的評論正好解釋

//while the timer ticks 
while (i_seconds != 0 && i_minutes != 0) 

不,這並不讓計時器再次因爲蜱你輸入一個循環,只有當你的一個變量達到零時退出。

這不會發生,因爲引發了新的滴答事件,但根據您的計算在循環內部發生。所需的時間可能比一秒鐘少很多。最後到達事件處理程序的末尾,並使用while循環中計算的最後一個值更新標籤。

您應該允許Tick事件結束並釋放控制您的操作系統,將能夠更新標籤

把上面一行

if (i_seconds != 0 && i_minutes != 0) 
{ 
    .... 
} 

現在你的代碼退出事件處理,操作系統更新標籤並根據Interval屬性中設置的值提高新的Tick事件

+0

哦哇...謝謝。 「時間」循環似乎在我的腦海中最有意義。但你是對的,剔不會開火。欣賞它,@Steve。 –