2009-08-27 30 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