フォームのコントロールに他のスレッドから書き込むとエラーになる

フォームのコントロールに、他のスレッドから、直接、データを書き込むことは、Visual Studio が禁止しています。

フォームのスレッドで作成したコントロールのプロパティに、他のスレッドからは、直接、書き込めないので、InvokeRequired、InvokeDelegate の仕組みを使います。

次のように記述します。sender や e 、それらをまとめた eventArgs が、スレッド間で引き継ぐデータです。

Delegate Sub MyEventHandlerDelegate(ByVal sender As Object, ByVal e As SomeEventArgs)

Private Sub MyHandler(ByVal sender As Object, ByVal e As SomeEventArgs)

If InvokeRequired Then

Dim eventArgs() As Object = {sender, e}
Invoke(New MyEventHandlerDelegate(AddressOf MyHandler), eventArgs)
Return

End If

//ここに、実際に行う処理

End Sub

VisionPro にサンプルが付属しています(Samples\Programming\QuickBuild\EfficientApp)。

例えば、フレームグラバの I/O 端子に信号を入力し、回数をテキストボックスに表示する場合、信号受信のイベントは、バックグラウンドのスレッドで呼ばれるので、上記のようなコードを使って、カウントし、表示します。