2

CreateEvent で作成されたグローバル イベントがあり、OpenEvent を使用して別のアプリケーションでこのイベントへのハンドルを取得します。

次に、次のようなことをしたい:

(疑似コード)

register_event_change_notification(my_call_back);

void my_call_back()
{
  // do work
}

my_call_back は、register_event_change_notification を呼び出したのと同じスレッドで実行されます。しかし、私の問題は、これを許可する API が見つからないことです。次のオプションしかないようです。

  1. WaitForSingleObject を使用するスレッドを作成し、my_call_back を呼び出すだけで、すべてにクリティカル セクションを配置します。

  2. WaitForSingleObject を使用するスレッドを作成し、メイン スレッドをメッセージ ループでブロックします。その後、WaitForSingleObject が my_call_back をメッセージ ループと同じスレッドで実行するときにイベントを投稿します。

これは、何度も解決されたに違いない単純な問題のように思えますか? イベントがいつIMOに通知されたかを知るためだけに、スレッド化の問題に対処しなければならないのはやり過ぎです。

編集:

結局、私は QueueUserApc を使用することにしましたが、スレッドをアラート可能な状態にするには、メッセージの書き込みで *Ex API を使用する必要があることを意味します。もう 1 つの落とし穴は、未処理の APC を追跡する必要があり、すべての APC にサービスを提供する前にオブジェクトを破棄しないことです。そうしないと、破壊/削除されたオブジェクトにキューに入れられた APC を取得します。

4

2 に答える 2

0

オプションの分析は正しいです。メッセージを使用するオプション 2 の場合、通知を目的のスレッドに誘導するための 2 つのオプションがあります。(a) 非 GUI スレッド宛先の場合、PostThreadMessage を使用します。(b) GUI スレッド宛先の場合、PostMessage または SendMessage を宛先 HWND に送信できます。メッセージは、HWND を作成したスレッドによって受信されます。

于 2013-06-18T12:04:48.750 に答える