2009-07-23 84 views
14

我想要一個定時器在Winform中每秒鐘打勾一次,當我尋找關於如何做到這一點的建議時,我發現有關線程的東西的負載。我不關心線程,因爲我試圖做的是在一分鐘內將值從60減少到0,然後停止。我不認爲我們需要進入雲計算來解決這個問題,但是我真的是一個網絡形式的機構,所以在這個問題上我有點生疏。任何人都可以指向我一個例子Winforms傻瓜計時器

這裏就是我試圖

private void button1_Click(object sender, EventArgs e) 
    { 
     this.timeLeft = 60; 
     this.label1.Visible = false; 
     this.button1.Visible = false; 
     gt = new Timer(); 
     gt.Tick += new EventHandler(CountDown); 
     gt.Interval = 1000; 
     gt.Start(); 
    } 

private void CountDown(object sender, EventArgs e) 
{ 
    do 
    { 
     this.TimeBar.Value = timeLeft;     
     this.timeLeft -= 1; 
    } while (this.timeLeft > 0); 
    if (this.TimeBar.Value > 0) return; 
    gt.Stop(); 
    this.label1.Visible = true; 
    this.button1.Visible = true; 
} 

任何幫助,將不勝感激。

回答

8

發生了什麼事情是,您正在遞減timeLeft變量,直到它在計時器的第一次滴答時達到零。取出do...while循環,你會有一個基本的工作示例。

但是,如果您要做任何量的Windows Forms工作,您需要了解線程以及它如何影響UI。如果你不喜歡關於無用的例外和不合適的UI組件,你很快就會發現自己回到了這裏。 Jon Skeet有很棒的threading series。我強烈推薦它。它有專門用於定時器的部分,所以可能會給你一些額外的見解。

+0

並且不要忘記在倒計時結束後禁用計時器,否則會遇到負數。 – 2009-07-23 22:06:01

+0

謝謝,這裏很晚,當然我不需要循環,呵呵!還要感謝Skeet先生的線程文檔的鏈接。 :) – 2009-07-23 22:16:32

+0

@Martinho - Obligado,是的,這也讓我也:) – 2009-07-23 22:17:47

8

不需要如果你使用winforms的定時器需要線程。

放置一個Timer控件的頁面上,將其命名爲「計時器」,並粘貼以下代碼:

public MainForm() 
{ 
    InitializeComponent(); 

    timer.Interval = 1000; 
    timer.Start(); 

    timeLeft = 60; 
    timer.Tick += Timer_Tick; 

    // start things 
    label1.Hide(); 
    button1.Hide(); 
    timer.Start(); 

} 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    timeLeft--; 

    if (timeLeft <= 0) { 
     timer.Stop(); 
     label1.Show(); 
     button1.Show(); 
    } 
} 

我想如果你來自一個絲網的背景下,事件驅動編程是可能的事情如果你想了解桌面上的東西是如何編程的,你需要開始閱讀。

+0

謝謝,是的線程的東西只是噪音,我已經得到它現在排序,但我也有一些很好的閱讀指針。 – 2009-07-23 22:21:45

2

你不想在你的事件處理程序中做任何循環。按照定時器'tick'調用處理程序一次 - 每1000毫秒,就像您配置它一樣。所以你想每次通話減少你的timeLeft變量,然後當timeLeft達到零時關閉整個事情。

// untested 
private void CountDown(object sender, EventArgs e) 
{ 
    this.TimeBar.Value = timeLeft; 
    this.timeLeft--; 
    if (this.TimeBar.Value == 0) 
    { 
     gt.Stop(); 
     this.label1.Visible = true; 
     this.button1.Visible = true; 
    } 
} 
3

除了取出環路(按jasonh的答案),如果應用程序是怎麼樣的忙你的做法可能會變得有些不準確。儘管您指定了它們的間隔(以毫秒爲單位),但WinForms定時器的分辨率爲18毫秒,優先級非常低,消息循環僅檢查定時器是否找不到其他任何事情。

因此,請保留StartTime(DateTime)值並使用它計算每個Timer事件中的剩餘時間。你可能需要61滴答才能達到一分鐘。