2012-04-11 86 views
0

我試圖做出改變每秒鐘事件的標籤,更改標籤。我現在所做的就是讓線程從「搖滾」一直睡到「拍攝」,並跳過「紙」和「剪刀」。有沒有人有任何想法,我應該怎麼做才能正確顯示標籤,以便它們都以相同的時間增量顯示?任何幫助將非常感激。在時間增量

lblCountdown.Text = "Rock" 
System.Threading.Thread.Sleep(1000) 
lblCountdown.Text = "Paper" 
System.Threading.Thread.Sleep(1000) 
lblCountdown.Text = "Scissors" 
System.Threading.Thread.Sleep(1000) 
lblCountdown.Text = "Shoot!" 
+0

@KenWhite:'的Invalidate()'發佈消息到隊列;它不會立即重繪。而'文字'制定者會爲你打電話。 – SLaks 2012-04-11 21:53:13

+0

@SLaks:謝謝你的澄清。 :)我會刪除我之前的評論。 (正如我所說的,我不是一個VB.NET開發人員,我不會做這樣的事情我自己,我通常使用線程做的工作,和線程郵件投遞到UI線程更新狀態。 – 2012-04-11 21:56:25

回答

1

如果你從UI線程調用它,渲染將鎖定,直到代碼執行完畢,所以你不會看到紙張或剪刀。一種解決方案(不是最佳解決方案,但是a解決方案)是在每個Sleep之前呼叫Me.Refresh()Application.DoEvents()。這將告訴用戶界面重新繪製自己。

一個更好的解決辦法是使用某種類型的計時器的蜱以1秒的間隔,這將在另一個線程操作,釋放您的UI線程更重要的事情。

0

定時器和調用。將處理這一個好辦法:

Private WithEvents m_tmrGame As New System.Timers.Timer(1000) 
Private m_intShouldBeAnEnum As Integer = 1 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    m_tmrGame.Start() 

End Sub 

Private Sub m_tmrGame_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles m_tmrGame.Elapsed 

    Dim strCurrentObject As String = String.Empty 

    Select Case m_intShouldBeAnEnum 
     Case 1 
      strCurrentObject = "Rock" 
      m_intShouldBeAnEnum = 2 
     Case 2 
      strCurrentObject = "Paper" 
      m_intShouldBeAnEnum = 3 
     Case 3 
      strCurrentObject = "Scissors" 
      m_intShouldBeAnEnum = 4 
     Case 4 
      strCurrentObject = "Shoot!" 
      m_intShouldBeAnEnum = 1 
      m_tmrGame.Stop() 
    End Select 

    lblCountdown.Invoke(Sub(lblTarget As Label) lblTarget.Text = strCurrentObject, New Object() {lblCountdown}) 

End Sub