在多線程類中引發事件?在多線程類中引發事件?
我正在運行一個類(遊戲手柄處理程序),它使用許多子線程來檢查鍵輸入等,然後它將事件引發到我的窗體以排除所需的反應,是否有辦法讓事件引發與課程本身相同的線程。
在多線程類中引發事件?在多線程類中引發事件?
我正在運行一個類(遊戲手柄處理程序),它使用許多子線程來檢查鍵輸入等,然後它將事件引發到我的窗體以排除所需的反應,是否有辦法讓事件引發與課程本身相同的線程。
最簡單的答案是「只在當前線程上提升事件。」由表單處理事件,然後使用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