Vb.net 将文本附加到不同线程和代码文件中的richTextBox
为了创建一个与串口设备接口的程序,我最近开始学习vb.net。为了保持结构整洁,vb代码被分为两个位置;第一个是用于初始化、单击按钮等的代码,而第二个是用于管理通信端口。分别命名为“MainWindow.xaml.vb”和“ComPortManager.vb” 在“comPortManager.vb”中:Vb.net 将文本附加到不同线程和代码文件中的richTextBox,vb.net,serial-port,richtextbox,invoke,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 ' Receiv
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”包含一个功能区(微软2010年10月发布的版本),带有设置、打开、关闭和发送控件(暂时保持独立和简单),窗口的其余部分是一个名为“RichTextBox1”的richTextBox
在搜索将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等都有点让我难以理解。关于Jonathan,我们有一个大型应用程序,其中一个文本框具有多个线程同时附加到它的状态,并且来自不同的形式。这是它的一个简化版本:
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(“要追加的文本”)。谢谢您的回复,我正在尝试。