如何从远程线程触发WinForms按钮单击

时间:2013-04-23 15:02:29

标签: vb.net multithreading winforms

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

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

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

我用Google搜索过,找不到任何有效的例子,所以我不确定这是否可行 - 我希望这是因为这是我项目的最后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

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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