2012-04-11 72 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