0

と呼ばれるラベルとValveと呼ばれるテキストボックスを使用するプログラムがありますVariable

要点は、Variable = 0thenの場合、ラベルの色が灰色である場合、Variable = 1thenの場合、ラベルは灰色と赤の間で点滅するスレッドを使用するということです。

これは、2つの値を非常にすばやく変更する場合(0を入力してから削除してから1を入力する場合など)を除いて、ほぼ完全に機能します。その後、スレッド速度が向上します(マルチスレッドのように)。

奇妙なことに、値0と1をゆっくりと(2秒ごとに+)交換しても、点滅速度は上がりません(これはプログラムが行う必要があることです)

これは、次の質問からの拡張コードです:vb.netマルチスレッド

注:これは、VisiWin.NET上の私のプロジェクトからの単なるVB.NET変換です。この例では、TextBoxVariableはPLCから読み取られた実際の変数であり、ラベルValveはプロセスフローシートの模倣からのプロセスソレノイドを表す三角形になります。すべてのソレノイドは、さまざまな変数によって制御されます。

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading
Imports System.Diagnostics

Public Class Form1

Private _flash As Boolean = False

Private Sub Variable1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Variable.TextChanged


    If Variable.Text = "1" And Not _flash Then
        _flash = True
        Dim FlashThread As New Thread(New ThreadStart(AddressOf FlashLabel))
        FlashThread.Start()
    End If

    If Variable.Text = "0" Then
        _flash = False
        Valve.ForeColor = Color.Gray
    End If

End Sub


Private Sub FlashLabel()

    Dim _Color As Color = Color.Gray
    While _flash

        If Valve.ForeColor = _Color Then
            Valve.ForeColor = Color.Red
        Else
            Valve.ForeColor = Color.Gray
        End If
        System.Threading.Thread.Sleep(2000)

    End While

End Sub

End Class
4

2 に答える 2

3

ここで何が起こっているかというと、最初に点滅しているスレッドがまだ実行中であり、2 秒間のスリープ フェーズにあるということです。値が 0 に変わります。ループがスリープ状態であるため、変数が再び 1 に戻り、スレッドが起動して続行され、まったく同じことを行う別のスレッドが生成されます。そのため、スレッドが高速化されているように見えます。

代わりにこれをタイマーに変更することをお勧めします。変数が 0 のときにタイマーを停止し、1 のときにタイマーを再開できるからです。

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading
Imports System.Diagnostics

Public Class Form1

Private _timer As New System.Windows.Forms.Timer()

Private Sub Variable1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Variable.TextChanged


    If Variable.Text = "1" And Not _flash Then
        _flash = True
        _timer.Interval = 2000
        _timer.Enabled = True
        _timer.Start()
    End If

    If Variable.Text = "0" Then
        _flash = False
        _timer.Stop()
        _timer.Enabled = False
        Valve.ForeColor = Color.Gray
    End If

End Sub


Private Sub FlashLabel() Handles _timer.Tick

    Dim _Color As Color = Color.Gray

    If Valve.ForeColor = _Color Then
        Valve.ForeColor = Color.Red
    Else
        Valve.ForeColor = Color.Gray
    End If

End Sub

End Class

タイマーのドキュメント: http://msdn.microsoft.com/en-gb/library/system.windows.forms.timer.aspx

または、スレッドをフィールドに保存し、変数が 0 に設定されたときにスレッドを終了することもできます。

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading
Imports System.Diagnostics

Public Class Form1

Private _flash As Boolean = False
Private _flashThread as Thread

Private Sub Variable1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Variable.TextChanged


    If Variable.Text = "1" And Not _flash Then
        _flash = True
        _flashThread As New Thread(New ThreadStart(AddressOf FlashLabel))
        _flashThread.Start()
    End If

    If Variable.Text = "0" Then
        _flash = False
        _flashThread.Abort()
        Valve.ForeColor = Color.Gray
    End If

End Sub


Private Sub FlashLabel()

    Dim _Color As Color = Color.Gray
    While _flash

        If Valve.ForeColor = _Color Then
            Valve.ForeColor = Color.Red
        Else
            Valve.ForeColor = Color.Gray
        End If
        System.Threading.Thread.Sleep(2000)

    End While

End Sub

End Class

スレッドの中止に関する注意事項についてはhttp://msdn.microsoft.com/en-GB/library/ty8d3wta.aspxを参照してください。ループの次の繰り返しの前に中止する必要があります。

于 2013-02-08T10:37:15.763 に答える
0

問題は次のとおりです。

  1. あなたは 1 を入力します, _flashis False: スレッドが開始され、色が変わり、2 秒間スリープします
  2. 1 を入力した後、すばやく 0 を入力すると、_flash:True_flashに設定されFalseます。
  3. 0 を入力した後、すぐに 1 を入力する_flashと、False再び : 新しいスレッドが開始されます。

ここで、最初のスレッドがスリープしている間にステップ 2 と 3 が発生した場合、実行中のスレッドは 2 つになります。_flash最初のスレッドがスリープを終了すると、それが実行されていることがわかり、True引き続き実行されます。

于 2013-02-08T10:33:26.937 に答える