我有一个表单,它使用类来处理richtextbox中的传入数据。数据通过串口接收。
当我加载表单时,我通过这样做来初始化类:
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
在表单中我初始化了serialport,一切都很好。当从串口接收到文本时,将调用此例程:
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,但我无法弄清楚它需要在哪里完成。
答案 0 :(得分:1)
这是因为从辅助线程返回DataReceived
事件。使用代表:
Private Sub MSComm1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles MSComm1.DataReceived
If Unloaded Then Exit Sub
'lambda sub acting as delegate
'all code inside this sub is on UI thread
Me.Invoke(Sub()
oDigi.RxComData(MSComm1.ReadExisting, Val(MyRXid))
End Sub)
End Sub