从类跨线程调用?困惑 - vb.net

发布于 2024-12-28 19:04:53 字数 842 浏览 3 评论 0原文

也许我被弯腰了...但事实是我对线程有点不熟悉...

我正在类中使用串行端口。我正在将一个事件从该类提升到我的表单中,称为该类。事件包含收到的数据...

我希望简单地从引发的事件填充文本框。

现在我并不是专门创建一个单独的线程,但是当我尝试更新 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

有人可以提供基于此代码的代码示例吗?

谢谢。

maybe I am being stooped... but the fact is that I am a bit of a n00b concerning threading...

I am making use of a serial port in a class. I am raising an event from that class to my form calling the class. Event contains data received...

I wish to simply populate a textbox from the raised event.

Now I am not specifically creating a seperate thread, but I get the normal crossthreading error when trying to update my textbox on the UI, so my assumption is that the serial port and its internal methods probably creates its own threads...

Regardless, I am a bit confused as to how to properly implement an invoke, from my main form, pointing to the thread in the instantiated class...

I hope this makes sense...


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

Can someone please provide a code example based on this code?

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

下雨或天晴 2025-01-04 19:04:53

您是对的,这里的问题是您正在尝试从非 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

以下是 MSDN 文档的链接,其中详细解释了它。

You are correct, the issue here is that you are attempting to update a UI element from a non-UI thread (in this case the serial port handler). What you need to do is check if the InvokeRequired flag is set on the control that you are trying to access from the callback. If so that means that you need to marshall your call to the UI thread. You can achieve this by using either Invoke or BeginInvoke from System.Windows.Forms.Control.

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

Here's a link to the MSDN documentation that explains it in detail.

沐歌 2025-01-04 19:04:53

或者简单地...

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
    If InvokeRequired Then
        Invoke(Sub()txt_rx.Text = str_data)
    Else
        txt_rx.Text = str_data
    End If
End Sub

Or simply...

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
    If InvokeRequired Then
        Invoke(Sub()txt_rx.Text = str_data)
    Else
        txt_rx.Text = str_data
    End If
End Sub
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文