为了创建一个与串口设备接口的程序,我最近开始学习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等在某种程度上让我无法理解。此致,乔纳森
答案 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(“要追加的文本”)。