0

我有一个我在 VB 2010 中开发的应用程序。它由一系列 Windows 窗体和一个侦听器进程组成,该进程侦听来自 MIDI 设备(键盘等)的输入。此侦听器进程在单独的线程中运行。

使用回调函数和调用方法,我可以使用在 MIDI 设备上播放的音符的值更新其中一个表单上的文本框的值(下面的代码)。

我似乎无法做的是触发一个按钮按下一个按钮,以便一段代码使用另一个回调函数在同一个表单上运行并调用。

我已经用谷歌搜索了,找不到任何工作示例,所以我不确定这是否可能——我希望这是因为这是我项目的最后 1%!

这是更新表单上的文本框的方法,我需要修改什么才能单击同一表单上名为 btn_NextSection 的按钮?

' Because the MIDI listener process runs in a different thread
' it can read the states of controls on the parent form but it
' cannot modify them so we need to identify the parent process
' and update the text box as that one instead

' Set up the callback
Private Delegate Sub SetNextSectionTextCallback(ByVal [text] As String)

' Updates NextSection
Private Sub SetNextSectionText(ByVal [text] As String)
    ' Function to see if the thread that tries to update the
    ' text box is the same as the one that started it.  If it
    ' isn't then locate parent process and update as that one
    If callerInstance.txt_NextSection.InvokeRequired Then
        Dim d As New SetNextSectionTextCallback(AddressOf SetNextSectionText)
        callerInstance.Invoke(d, New Object() {[text]})
    Else
        callerInstance.txt_NextSection.Text = [text]
    End If
End Sub

提前致谢 !

4

1 回答 1

0

假设您要运行代码,而不是模拟按钮单击,请尝试这样的事情。Invoke 需要一个函数,因此您可能需要创建一个虚拟返回对象。

Private Sub btn_NextSection_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btn_NextSection.Click
    NextSection()
End Sub

Private Function NextSection() As Object
    'do something on the UI thread
    Return Nothing ' to satisfy the requirements of Invoke
End Function

Private Sub AnotherThreadHere()
    'call NextSection on the UI thread
    Application.Current.Dispatcher.Invoke(Windows.Threading.DispatcherPriority.Background, New Action(Function() NextSection()))
End Sub
于 2013-04-23T15:30:14.717 回答