在多线程类中引发事件?
问题描述:
在多线程类中引发事件?在多线程类中引发事件?
我正在运行一个类(游戏手柄处理程序),它使用许多子线程来检查键输入等,然后它将事件引发到我的窗体以排除所需的反应,是否有办法让事件引发与课程本身相同的线程。
答
最简单的答案是“只在当前线程上提升事件。”由表单处理事件,然后使用Control.Invoke
在表单的线程上执行任何更新。
这里是更新Label
控件调用__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
方法。请参阅Control.InvokeRequired
Property以获取更多信息。
答
你的意思是,在主线程而不是子线程上引发事件?如果是这样,那么正确的方法是将事件排入主线程,并让主线程处理队列。本质上,主线程需要被写入队列中。一个典型的例子,如果这样的东西是在Windows UI线程中的消息处理。
如果这与您的情况相同,那么您应该向UI消息泵发送消息。
答
如何处理上的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";
});
}
的“本”犯规似乎工作, HMM和methodinvoker不会允许该委托格式 – Jim 2009-09-01 03:56:20
这是指控制;我看不到MethodInvoker如何不适合你,我从一些产品代码中获得了这个。它是一个C#VB的东西? – 2009-09-01 15:12:22
也许是具体到VB,但“这种”不工作,以“我”使用表单打交道时,答案{通过委托重播事件处理程序在形式上}似乎是如果(me.invokerequired) – Jim 2009-09-02 01:10:25