2009-08-27 3 views
1

マルチスレッドクラスでイベントを発生させますか?マルチスレッドクラスでイベントを発生させますか?

多くの子スレッドを使用してキー入力などをチェックするクラス(ゲームパッドハンドラ)を実行しているときに、必要な反応を整理するためにイベントをフォームに提出します。イベントを発生させる方法はありますかクラス自体と同じスレッド

答えて

5

最も単純な答えは、「ただ現在のスレッドでイベントを発生させる」ことです。イベントを処理し、Control.Invokeを使用してフォームのスレッドの更新を実行するのは、フォームに依存します。

__messageという別のスレッドからLabelというコントロールを更新するための推奨される方法は次のとおりです。

書式に次のコードを追加します。必要な場合

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プロパティを参照してください。イベントは(C#のコードのために申し訳ありませんが、それは簡単に翻訳しなければならない)別のスレッドから呼び出されている可能性があり時にGUIスレッド上の任意のイベントを処理する方法

0

あなたは、子スレッドではなくメインスレッドでイベントを発生させるのですか?もしそうなら、これを行う正しい方法は、イベントをメインスレッドにキューイングし、メインスレッドがキューを処理させるようにすることです。基本的に、メインスレッドはキューから作業を行うために書き込まれる必要があります。このようなものがWindowsのスレッド内のメッセージ処理である場合の典型的な例です。

これがあなたのケースと同じ場合は、UIメッセージポンプにメッセージを送信する必要があります。

0

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

"this"は動作しません。 hmmです。このメソッドは、委任者の書式を許可しません。 – Jim

+0

これはコントロールを指します。私はMethodInvokerがあなたのために働いていないのを見ることができません。私はこれをいくつかのプロダクションコードから取り出しました。それはVBの事にはC#ですか? –

+0

多分それはVBに固有ですが、 "Me"という形式を扱うときには "this"は動作しません。答えは(me.invokerequired){デリゲートを介してフォームのイベントハンドラを再実行してください} – Jim

関連する問題