[英]Cross-thread operation not valid in vb.net with serial port
我有一個使用類處理富文本框中的傳入數據的表單。 數據通過串口接收。
當我加載表單時,我通過執行以下操作初始化類:
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
在上面的“如果”行中,我收到以下錯誤“跨線程操作無效:控件”從創建該線程的線程之外的其他線程訪問。
僅當我使用串行端口時才會發生這種情況。 如果我通過其他方法輸入文本,則不會出現錯誤。 在Microsoft上進行一些搜索后,我發現串行端口類將在其自己的線程中運行,因此我了解單獨的線程來自何處。 但是我不知道如何解決它。 我猜我需要使用.invoke,但我不知道需要在哪里完成。
這是因為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.