1

私は完全にシングルスレッドであり、データ構造を保護していないWindowsプログラムに取り組んでいます。ただし、プログラムはDirectShow APIを使用して、独自の内部メッセージディスパッチ、たとえばIVideoWindow::put_Visibleを開きます。したがって、IVideoWindow :: put_Visibleメソッドを呼び出すイベント処理関数は、他のイベント処理関数にそのデータを台無しにする機会を与えます。

API内でそのようなメッセージディスパッチを防ぐ方法はありますか?

4

1 に答える 1

0

質問は私には少しわかりません。内部でモーダル メッセージ ループに入る API について話しているのでしょうか。これは、ある種の再入問題を引き起こしていますか? その場合は、おそらく問題を解決するためのより良い方法があります。API がモーダル ループに入っている場合は、間違いなく正当な理由があり、そうするのを許可する必要があります。(あなたの場合、DirectShow は別の COM オブジェクトと内部的に通信していると思います。) 適切に記述されていれば、モーダル ループは同じスレッド上の他のウィンドウにメッセージをディスパッチします。

いずれにせよ、本当にこれをやりたい場合は、次の方法があります。

PostQuitMessage( 0 ); // Signal quit to force the upcoming loop to exit
APIFunc(); // Enters modal loop internally
MSG msg;
PeekMessage( &msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE ); // Eat the next WM_QUIT

最後のステップが重要です。WM_QUIT メッセージが原因でモーダル ループが終了した場合、終了後に独自の終了メッセージを送信する必要があります (アプリが終了することを認識できるようにするため)。食べない場合、アプリケーションは終了します。

于 2009-06-04T19:59:42.140 に答える