2015-10-15 98 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