在多线程类中引发事件?
我正在运行一个类(游戏手柄处理程序),它使用许多子线程来检查键输入等,然后它将事件引发到我的表单以解决所需的反应,是否有办法使事件在与类本身相同的线程。
答案 0 :(得分:6)
最简单的答案是,“只是在当前线程上引发事件。”由表单处理事件然后使用Control.Invoke
在表单的线程上执行任何更新。
以下是从另一个帖子更新名为Label
的{{1}}控件的推荐方法。
将以下代码添加到表单。
__message
然后根据需要调用表单 Delegate Sub SetTextDelegate(ByVal message As String)
Public Sub SetText(ByVal message As String)
If __message.InvokeRequired Then
Dim oCall As New SetTextDelegate(AddressOf SetText)
Me.Invoke(oCall, New Object() {message})
Else
__message.Text = message
End If
End Sub
。
您可以使用.SetText(<messageToDisplay>)
或Control.Invoke
方法。有关详细信息,请参阅Control.BeginInvoke
属性。
答案 1 :(得分:0)
你的意思是,在主线程而不是子线程上引发事件?如果是这样,那么正确的方法是将事件排入主线程并让主线程处理队列。基本上,需要编写主线程来处理队列。一个典型的例子,如果像这样的东西是windows ui线程中的消息处理。
如果这与您的情况相同,那么您应该向UI消息泵发送消息。
答案 2 :(得分:0)
如果在从另一个线程调用事件时如何处理GUI线程上的任何事件(对C#代码感到遗憾,但它应该很容易翻译):
void myEventHandler(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(delegate() { myEventHandler(sender,e); }));
return;
}
// write code to handle event here
}
备用语法:
if (this.InvokeRequired)
{
this.BeginInvoke((MethodInvoker)delegate
{
myLabel.Text = "What a great post";
});
}