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!"
4

2 に答える 2

1

UIスレッドから呼び出している場合、コードが終了するまでレンダリングがロックされるため、PaperやScissorsは表示されません。1つの解決策(最善の解決策ではありませんが解決策)は、それぞれの前に呼び出すことMe.Refresh()です。これにより、UIにそれ自体を再描画するように指示されます。Application.DoEvents()Sleep

より良い解決策は、1秒間隔でティックするある種のタイマーを使用することです。これは別のスレッドで動作し、UIスレッドをより重要なことのために解放します。

于 2012-04-11T21:00:34.550 に答える
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
于 2012-04-11T21:57:48.873 に答える