フォームのコントロールに、他のスレッドから、直接、データを書き込むことは、Visual Studio が禁止しています。
フォームのスレッドで作成したコントロールのプロパティに、他のスレッドからは、直接、書き込めないので、InvokeRequired、Invoke、Delegate の仕組みを使います。
次のように記述します。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 端子に信号を入力し、回数をテキストボックスに表示する場合、信号受信のイベントは、バックグラウンドのスレッドで呼ばれるので、上記のようなコードを使って、カウントし、表示します。