0

クラスを使用してリッチテキストボックスの受信データを処理するフォームがあります。データはシリアルポート経由で受信されます。

フォームをロードすると、次のようにしてクラスを初期化します。

oDigi = New DigitalProcessing
oDigi.InitHostForm(Me, 1, MyParentNumber)

そしてそれはクラスでこれを実行します:

Public Sub InitHostForm(ByVal theHostForm As Object, ByVal iInterface As Integer,      Optional ByVal Parent As Integer = 0)
Hostform = theHostForm
ParentNr = Parent
End Sub

フォームでシリアルポートを初期化し、すべてが良好です。シリアル ポートからテキストを受信すると、次のルーチンが呼び出されます。

Private Sub MSComm1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles MSComm1.DataReceived
    If Unloaded Then Exit Sub
    oDigi.RxComData(MSComm1.ReadExisting, Val(MyRXid))
End Sub

それはこのルーチンを呼び出します:

Public Sub PrintToRxWindow(ByVal sMsg As String, ByVal Index As Integer)
If Len(Hostform.rtfRX(Index).Text) > lMaxLen Then
LockWindowUpdate(Hostform.rtfRX(Index).Handle)
Hostform.rtfRX(Index).SelectionStart = 0
Hostform.rtfRX(Index).SelectionLength = 500
Hostform.rtfRX(Index).ReadOnly = False
Hostform.rtfRX(Index).SelectedText = ""
Hostform.rtfRX(Index).ReadOnly = True
LockWindowUpdate(0)
End If

上記の If 行で、「クロススレッド操作が無効です: コントロールが作成されたスレッド以外のスレッドからアクセスされました」というエラーが表示されます。

これは、シリアル ポートを使用している場合にのみ発生します。別の方法でテキストを入力すると、エラーは発生しません。Microsoft で検索を行ったところ、シリアル ポート クラスが独自のスレッドで実行されることがわかったので、個別のスレッドがどこから来ているのかを理解しています。しかし、私はそれを修正する方法がわかりません。.invoke を使用する必要があると推測していますが、どこで実行する必要があるかわかりません。

4

1 に答える 1