2013-06-29 17 views
0

其他人也有類似的問題,但他們實際上沒有得到一個有效的答案。我可以通過創建一個布爾值並將其設置爲false(一旦進入if語句)來獲得此工作。在使用該方法之前,我已經完成了它,但是,我想知道是否有更清晰的方法。C#消息框反覆出現在定時器中

問題:爲什麼當我用一個簡單的okay按鈕在計時器中使用消息框時,有人必須點擊好的;否則你每秒都會收到同樣的信息?在下面的代碼中;它會每秒彈出一次,因爲這是計時器設置要做的事情(按一秒鐘),但它應該只顯示一次,當計時器像下面的代碼那樣擊中10時,但計時器仍應該「滴答」因爲它顯示在標籤中。

之前有人把我撕成碎片,因爲我注意到人們喜歡在這裏做某些事情;我的邏輯說,自秒= 10,它應該顯示一次。當秒數= 11時,沒有意義,它會顯示一個額外的盒子,因爲它不是11。我想知道是什麼原因造成的?

private void randomtimer_Tick(object sender, EventArgs e) 
    { 

     if (seconds == 10) 
     { 
      MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?"); 
     } 
     seconds++;    
     if (seconds >= 60) 
     { 
      seconds = 0; 
      minutes = minutes + 1; 
     } 
     if (minutes >= 60) 
     { 
      minutes = 0; 
      hours = hours + 1; 
     } 

     string niceTime = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", hours, minutes, seconds); //format the time so it displays nicely 
     label2.Text = "Session Length:\n" + niceTime; 
    } 

回答

3

答案很簡單,因爲你不是遞增seconds直到MessageBox.Show()後。在if (seconds == 10)測試之前移動它並且您的代碼將起作用。

執行流程停止在MessageBox.Show(),然後觸發另一個時間事件。對於定時器,您必須始終使用重新進入時的注意。

+0

那太簡單了,太尷尬了。 – slcboi

+0

我不認爲你需要比我包括的任何更多的代碼:) – tcarvin

+0

謝謝你的快速回答。那確實解決了它。直到我看完你所說的話之後,我纔想起它。 – slcboi

0

我會盡力解釋這一點,儘可能簡單,因爲我可以忍受我。

當計時器的處理程序被調用時,計數器不會被阻塞。每秒(計時器的間隔)您提供的功能運行。現在,當您顯示MessageBox時,計時器處理程序的線程被阻止。因此,只有在用戶點擊確定並且功能恢復後,您的代碼纔會繼續運行。現在

,如果用戶不按OK,第二個會卡住在10.1秒後,計時器會再次調用處理程序和您的if將運行,因爲該值仍保持在10

如果你想避免這種情況,可以使用類似這樣的代碼:

 if (seconds == 10) 
     { 
      seconds++; 
      MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?"); 
     } 
     else 
      seconds++; 

當然還有更好的方法,但這會工作。

+1

不同意,這很可能是GUI線程中的'Windows.Forms.Timer'。只要它是自己的消息泵,事件仍然可以觸發。 – tcarvin

+0

這也是有道理的。我沒有真正想到這一點。雖然;它仍然正確添加每個消息框添加秒。但我相信我明白你在說什麼。仍然用這個來學習一些東西。再次;謝謝(你的)信息。 :) – slcboi

+0

@tcarvin感謝您的信息。我不知道它是否是UI線程。我可以寫一個計時器,使用另一個線程,而不會出現人們可能會想到的問題,但最終我認爲你是對的。我會試着爲這部分提出更好的判斷。 –

0

有人必須點擊確定;否則你每秒都會收到同樣的信息?

現在,這是你的問題。再看看代碼:

if (seconds == 10) 
{ 
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?"); 
} 
seconds++; 

秒不會增加,直到MessageBox.Show被駁回後。將其更改爲:

if (seconds == 10) 
{ 
    seconds++; 
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?"); 
} 
else seconds++; 

並且將解決您的問題。

+1

在這種情況下,它將在第9秒運行。你應該把它改成'if(seconds == 11)' –

+0

是的;那確實解決了它。它發生在我以前;但它是間歇性的,現在我知道爲什麼。也感謝你的快速回應。 – slcboi