我有一个我在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
提前致谢!
答案 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