0

システムのコーディングを行っていて、VB.NET で通常のタイマーの代わりにスレッドを使用する必要があります。

正常に動作しますが、問題は点滅のタイミングにあります。ボタンをクリックすると、期待どおりに点滅します。テストで複数回クリックすると、点滅時間が元のスリープ スレッド時間 (750ms) でほぼ乗算され、これが続きます。クリックごとに発生します。

まばたきが速くならないようにするにはどうすればよいですか? 以下はコードです!

    Private _flash As Boolean = False

    Private Sub btnButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnButton1.Click
        _flash = True
        Dim FlashThread As New Thread(New ThreadStart(AddressOf FlashLabel))
        FlashThread.Start()

    End Sub

    Private Sub FlashLabel()

        Dim _color As Color = Color.Gray    

        While _flash

              If label1.ForeColor.Equals(_color) Then
                    label1.ForeColor = Color.Red
              Else
                    label1.ForeColor = Color.Gray

              System.Threading.Thread.Sleep(750)

        End While
    End Sub
4

2 に答える 2

0

元のスレッドをキャンセルすることはないため、もう一度ボタンをクリックすると、2 つのスレッドが実行され、点滅が発生します。

そのため、別のアクションでスレッドをキャンセルするか、最初にスレッドを開始してから _flash を true と false に設定することができます。

于 2013-02-07T15:15:41.743 に答える
0

ボタンをクリックするたびに新しいスレッドが開始されるため、ボタンを 2 回クリックすると 2 つのスレッドが開始され、どちらも 750 ミリ秒間隔で色を切り替えているため、1 つのスレッドが実行しているように見えます。倍速です。これを回避する簡単な方法は、_flashフラグが既に設定されている場合、新しいスレッドの開始を単純にスキップすることです。たとえば、次のようになります。

Private Sub btnButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnButton1.Click
    If Not _flash Then
        _flash = True
        Dim FlashThread As New Thread(New ThreadStart(AddressOf FlashLabel))
        FlashThread.Start()
    End If
End Sub
于 2013-02-07T15:13:59.620 に答える