2009-08-27 28 views
1

在多线程类中引发事件?在多线程类中引发事件?

我正在运行一个类(游戏手柄处理程序),它使用许多子线程来检查键输入等,然后它将事件引发到我的窗体以排除所需的反应,是否有办法让事件引发与课程本身相同的线程。

回答

5

最简单的答案是“只在当前线程上提升事件。”由表单处理事件,然后使用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.InvokeControl.BeginInvoke方法。请参阅Control.InvokeRequired Property以获取更多信息。

0

你的意思是,在主线程而不是子线程上引发事件?如果是这样,那么正确的方法是将事件排入主线程,并让主线程处理队列。本质上,主线程需要被写入队列中。一个典型的例子,如果这样的东西是在Windows UI线程中的消息处理。

如果这与您的情况相同,那么您应该向UI消息泵发送消息。

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"; 
    }); 
} 
+0

的“本”犯规似乎工作, HMM和methodinvoker不会允许该委托格式 – Jim 2009-09-01 03:56:20

+0

这是指控制;我看不到MethodInvoker如何不适合你,我从一些产品代码中获得了这个。它是一个C#VB的东西? – 2009-09-01 15:12:22

+0

也许是具体到VB,但“这种”不工作,以“我”使用表单打交道时,答案{通过委托重播事件处理程序在形式上}似乎是如果(me.invokerequired) – Jim 2009-09-02 01:10:25