2011-12-07 9 views
0

スレッドとして動作するようにクラスが作成されています。オブジェクトのイベント処理はどのスレッドで処理されますか?

このクラスでは、オブジェクトを作成します。このオブジェクトには、スレッドクラス内で作成されたメソッドへのコールバックを実行するイベントがあります。

それで、私の主なアプリケーション/ GUIスレッドはこのスレッドを作成します&これを起動します。

私の主なGUIスレッドはアイドル状態(キーボードイベント待ち)です&スレッドのexecuteメソッドは、無限ループ(終了待ち)で座っています。

次に、作成されたオブジェクトが何かを検出し、イベントを発生させ、スレッドクラスメソッドへのコールバックをトリガーします。

質問は、このスレッド/プロセスはこの方法で実行されますか? 私の主なアプリケーションスレッド(& GUIハンドラ)? または、イベント/コールバックを起動したオブジェクトを作成したスレッドを開始しましたか?

私は主なアプリケーションスレッドが中断されていると推測しています。これは正しいですか?

+0

どのスレッドがコールバックを実行しているかについて十分な情報を提供していません。コールバックは、オブジェクトを作成したスレッドにキューイングされているAPC(つまり、 '私が開始したスレッド')か、カーネルスレッドからのコールバックか、別のプロセスからのスレッドを経由して直接コールバックできます。共有メモリ。あなたのメインアプリケーションスレッドは、コールバック時に実行されているかもしれないし、実行されていないかもしれません - いくつかのコールバックがいくつかのどこかで実行されているため、糸。 –

+0

@マーティン・ジェイムス彼はサイキックだから彼は十分な情報を提供していないが、私たちは忘れている –

答えて

0

ここでは魔法はありませんが、イベントハンドラは単にイベントを発生させたコードと同じスレッドで実行されます。イベントハンドラでUIを更新する必要がある場合は、UIオブジェクトを作成したスレッド以外のスレッドから行うのは正当ではありません。

ワーカースレッドからUIスレッドへの呼び出しをマーシャリングする必要があります。これは、UIを実装するクラスライブラリによって常にサポートされています。あなたは言っていない、それはWinFormsのようなにおいがある場合はControl :: BeginInvoke()を使用します。それが未処理のWindowsの場合、PostMessage()を使用します。 Etcetera。

0

コールバックは、イベントを待機してコールバックを呼び出すスレッドで実行されます。この場合、それはワーカースレッドです。

メインスレッド(GUIスレッド)は中断されず、潜在的なコンテキスト切り替えを行うためのOSの中断をカウントしません。