2015-10-15 96 views
-1

這是我第一次使用串口,​​所以我剛剛得知他們在不同的線程上運行,我不知道多線程,所以我不知道從哪裏開始修復我的代碼,網絡搜索只是讓我更像Invoke。SerialPorts和多線程 - 跨線程操作無效

下面是我通過rs232端口連接的條碼掃描器的整個代碼,我只是接收數據並將其放在標籤上。

在設置標籤文本所接收到的數據,我得到一個錯誤......

跨線程操作無效:控制「Label1的」從比它創建的線程以外的線程訪問。

Imports System.IO.Ports 

Public Class Form1 

Dim WithEvents com4 As New SerialPort 

Private Sub com4_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles com4.DataReceived 
    Dim returnStr As String 
    returnStr = com4.ReadExisting 
    Label1.Text = returnStr 
    com4.DiscardInBuffer() 
End Sub 


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Try 
     With com4 
      .PortName = "Com4" 
      .BaudRate = 38400 '9600 
      .Parity = Parity.None 
      .DataBits = 8 
      .StopBits = StopBits.One 
     End With 
     com4.Open() 

    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

End Class 

回答

1

如果你有

Label1.Text = returnStr 

更換符合

Me.BeginInvoke(Sub() 
         Label1.Text = returnStr 
        End Sub) 

編輯:

如果你有

Label1.Text = returnStr 

更換符合

UpdateLabel(returnStr) 

,並添加該代碼

Private Delegate Sub UpdateLabelDelegate(theText As String) 
Private Sub UpdateLabel(theText As String) 
    If Me.InvokeRequired Then 
     Me.Invoke(New UpdateLabelDelegate(AddressOf UpdateLabel), theText) 
    Else 
     Label1.text = theText 
    End If 
End Sub 
+0

嗨,我使用Visual Studio 2008和這似乎並沒有工作。 – crimson

+0

謝謝,你介意解釋2個答案之間的區別嗎?我嘗試了visual studio 2010的第一個答案,它的工作原理。第一個答案對我來說也很簡單。 – crimson

+0

這兩個都會導致控件在UI線程上被操縱。第一次使用lamda,這使得它更簡單。 – dbasnett