Delegate Invoke

スレッドを使ってループ処理をする場合、
フォームのコントロールを直接触ることは禁止される。
たとえば、
TextBox1.Text  =  ”Hello” は、スレッド中に直接記述することはできない。

スレッド中でも間接的にコントロールを触る方法はある。
DelegateInvoke を使う。
記述の仕方がいろいろ掲載されているため、自分にとってどれが
いいのか判断しにくい。

安全では無いかもしれないけれど、簡潔で動作したので
メモしておく。(結構使用したが、特に問題なし)

' ・対象とするスレッドの宣言
Public Thread_Rx As System.Threading.Thread
--
' ・コントロールの表示変更をする関数
Private Sub ShowLed()
          ' LEDを模したコントロールの表示変更処理
          label1.BackColor = Color.Red
End Sub
--

' ・スレッド本体
Delegate Sub Thread_Rx1_Delegate()  'Delegate使うことの宣言(関数名は自由)
Public Sub Thread_Rx1()                  'スレッド本体   
     While(True)
         Thread.Sleep(10)
          ' LED表示変更処理
          Me.Invoke(New Thread_Rx1_Delegate(AddressOf ShowLed))   ' LED表示
     End While
End Sub

--
スレッドをSTART!
        Dim thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf Thread_Rx1))
        thread1.Start()
※スレッドを終了するときは、別途STOPする(他サイト参照)。
---
記述方法が違うが参考になるサイト。なぜInvokeが必要か分かる

これにより、スレッド本体からLEDを模すlabel1へアクセスできる。

- 余 談 -
C#の場合、
「 Me.Invoke(New Thread_Rx1_Delegate(AddressOf ShowLed)) 」の部分は、
Invoke(new Thread_Rx1_Delegate(ShowLed)) で良い。
--------