簡體   English   中英

跨線程操作在帶有串行端口的vb.net中無效

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM