Lou*_*der 0 vb.net multithreading serial-port invoke
也许我被困了......但事实是我对线程有点n00b ...
我正在使用类中的串行端口.我正在从该课程中提出一个事件来调用我的课程.事件包含收到的数据......
我希望简单地从引发的事件中填充一个文本框.
现在我不是专门创建一个单独的线程,但是当我尝试在UI上更新我的文本框时,我得到了正常的交叉线程错误,所以我的假设是串口和它的内部方法可能会创建自己的线程......
无论如何,我对如何从我的主窗体正确实现一个调用有点困惑,指向实例化类中的线程...
我希望这是有道理的...
Dim WithEvents tmpRS232 As New clsRS232
Private Sub but_txt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles but_txt.Click
tmpRS232.Set_com_port("COM8", 38400)
tmpRS232.Transmit_data(txt_tx.Text)
End Sub
Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
txt_rx.Text = str_data 'Cross threading error
MsgBox(str_data) 'Fires without errors
End Sub
Run Code Online (Sandbox Code Playgroud)
Dim WithEvents tmpRS232 As New clsRS232
Private Sub but_txt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles but_txt.Click
tmpRS232.Set_com_port("COM8", 38400)
tmpRS232.Transmit_data(txt_tx.Text)
End Sub
Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
txt_rx.Text = str_data 'Cross threading error
MsgBox(str_data) 'Fires without errors
End Sub
Run Code Online (Sandbox Code Playgroud)
有人可以提供基于此代码的代码示例吗?
谢谢.
你是对的,这里的问题是你试图从非UI线程(在这种情况下是串口处理程序)更新UI元素.您需要做的是检查您尝试从回调访问的控件上是否设置了InvokeRequired标志.如果是这样意味着您需要编组对UI线程的调用.您可以使用System.Windows.Forms.Control中的 Invoke或BeginInvoke来实现此目的.
Private Delegate Sub SetRxTextCallback(ByVal [text] As String)
Private Sub SetRxText(ByVal [text] As String)
txt_rx.Text = [text]
End Sub
Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
If (txt_rx.InvokeRequired) Then
Dim d As New SetRxTextCallback(AddressOf Me.SetRxText)
Me.BeginInvoke(d, New Object() {[str_data]})
End If
'txt_rx.Text = str_data 'Cross threading error
'MsgBox(str_data) 'Fires without errors
End Sub
Run Code Online (Sandbox Code Playgroud)
这是MSDN文档的链接,详细解释了它.
归档时间: |
|
查看次数: |
6818 次 |
最近记录: |