将文本附加到不同线程和代码文件中的richTextBox

时间:2011-09-28 17:29:55

标签: vb.net serial-port richtextbox invoke

为了创建一个与串口设备接口的程序,我最近开始学习vb.net。为了保持结构整洁,vb代码已分为两个部分;第一个是用于初始化,点击按钮等的代码,而第二个用于管理通信端口。它们分别命名为“MainWindow.xaml.vb”和“ComPortManager.vb”。

在'comPortManager.vb'中:

Dim RXArray(2047) As Char ' Array to hold received characters
Dim RXCnt As Integer      ' Received character count

    Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles comPort.DataReceived
        Do
            RXCnt = 0
            Do
                 'Populates the array, RXArray and counts the number of characters, RXCnt
            Loop Until (comPort.BytesToRead = 0) 'Keeps reading the buffer until it is empty
            'Code for posting to the richTextBox
        Loop Until (comPort.BytesToRead = 0) 'If the buffer has been written to in the meantime, repeat
    End Sub

'MainWindow.xaml'包含一个功能区(Microsoft的2010年10月发行版),其中包含用于设置,打开,关闭和发送的控件(暂时保持它们分离和简单),窗口的其余部分是名为'的富文本框' RichTextBox1' 。

搜索将RXArray的内容发布到RichTextBox1的方法提出了许多基于Invoke或BeginInvoke的建议。实际上,工作示例已成功运行,但与Invoke相关的所有代码都在一个文件中,后面是代码。 (如果我错了,请纠正我,但这对于小型程序来说听起来不错,但是对于中等到大型的程序可能会变得臃肿,因此我想找到更好的解决方案)

最接近跑步的代码(我相信)如下:

'在comPort_DataReceived中...填充数组后

If RichTextBox1.InvokeRequired Then
                RichTextBox1.Invoke(New MethodInvoker(AddressOf Display))
            End If

'并返回主代码

Public Delegate Sub MethodInvoker()

Private Sub Display()
    RichTextBox1.AppendText(New String(RXArray, 0, RXCnt))
End Sub

这有一些问题,我不确定在这个阶段走向何方。 RichTextBox1位于不同的线程中,因此无法识别; InvokeRequired不是System.Windows.Controls.RichTextBox的成员,同样使用Invoke;最后,在示例中,名为MethodInvoker的代表从未如上所述。

非常感谢有关此主题的任何帮助。在这几个星期里,Invoke,BeginInvoke等在某种程度上让我无法理解。此致,乔纳森

1 个答案:

答案 0 :(得分:2)

我们有一个大型应用程序,其中一个文本框具有多个线程的状态,它们同时附加到它,并且来自不同的形式。这是一个愚蠢的版本:

Public Sub addToMessageBox(ByVal msg As String)
    If Me.InvokeRequired Then
      Dim d As New AddToMessageBoxDelegate(AddressOf Me.addToMessageBox)
      Me.BeginInvoke(d, New Object() {msg})
    Else
      Try
        Me.MessageBox.AppendText("--" + msg + vbCrLf)
      Catch ex As Exception
      End Try
    End If
  End Sub

代表在开头宣布

Private Delegate Sub AddToMessageBoxDelegate(ByVal msg As String)

我能看到的最大区别是我使用了父类的beginInvoke()和InvokeRequired()。我想试一试。在调用display()的地方调用parentClass.AddToMessageBox(“要追加的文本”)。