2011-07-21 6 views
1
  1. UIスレッドであるスレッドAがあるとします。
  2. スレッドAは、非UIスレッドである別のスレッドBを作成します。
  3. スレッドBがスレッドAでイベントを発生させたい場合は、 if(Form1.InvokeRequired)Form1.Invoke(同じメソッド)と同じメソッド内でイベントを呼び出しますか?

シンプルです。しかし、私の質問は、AとBの両方が非UIスレッドの場合、同じことをしたいのですが?スレッドBからInvoke()を呼び出すフォームオブジェクトはありません。2つの非UIスレッドでControl.Invoke()をシミュレートする方法

WinFormsのアプリケーションでは、なぜ非UIスレッドのようなメカニズムがないのでしょうか?何か不足していますか?他の非uiスレッドから非uiスレッドのイベントを発生させる同様の方法はありますか?

ありがとうございます。

P.S.プロデューサー/消費者モデルの回答は、私がここで探している回答ではありません。

答えて

1

最初のシナリオでは、スレッドB を認識しているので、それはUIスレッドではありません。.Invoke(...)を呼び出すこともできます。

UI以外のスレッドが2つある場合は、ある種のメッセージパッシング/キューを使用する必要があります。あなたはちょうど割り込みすることはできませんスレッドAを実行するには;スレッドAをコード化して(たとえば)キューをチェックし、アイテムをデキューして実行する必要があります。 winformsはWindowsのメッセージループの恩恵を受けています。それはあなたが探している答えではないかどうかは関係ありません - それはそれが何であるかです。

1

UIがない場合、クロススレッドの問題はありません。単にスレッドから呼び出すだけです。あなたはいくつかの同期メカニズムを必要とするかもしれません。

+0

スレッドの問題は、もちろんUIには適用されません; p個人的には、スレッドAが作業を実行したかったように解釈しましたが、私は間違っている可能性があります。 –

+0

君は正しいよね。 WinFormsが呼び出されたときに何か起こるような魔法を使用していないことを確認しなければなりませんでした。疑問を解決してくれてありがとう。私はあなたの答えを受け入れるでしょう。それはWindowsのメッセージループです。 – Harindaka

関連する問題