1

私は本質的にシングルスレッドのプログラムに取り組んでおり、その唯一のスレッドはメインのイベントループスレッドです。したがって、そのすべてのデータ構造は、基本的にクリティカル リージョンのようなものによって保護されていません。

DirectShow API に基づくいくつかの新しい機能が最近統合されるまで、問題なく動作します。一部の DirectShow API は 2 番目のイベント ループを開き、その 2 番目のループ内でメッセージをディスパッチします (つまり、他のイベント処理コールバックを予期せずに呼び出します)。そのため、2 番目のイベント処理関数が呼び出されると、DirectShow API を呼び出す関数によってアクセスされているデータ構造体が破損する可能性があります。

カーネルプログラミングの経験があります。そして、私の頭に浮かぶのは、シングルスレッドプログラムの場合、データ構造を処理する方法は、カーネルが CPU ごとのデータ構造を処理する方法と非常に似ているということです。また、カーネルでは、関数が CPU ごとのデータにアクセスする場合、割り込みを無効にする必要があります (2 番目のイベントループでのメッセージディスパッチと非常に似ています)。ただし、DirectShow API の呼び出しを回避したり、それらの中で 2 番目のイベント ループが作成されないようにする簡単な方法はありません。何か方法はありますか?

4

2 に答える 2

1

ミューテックス。セマフォ。ロック。呼びたい名前が何であれ、それが必要です。

于 2009-05-14T18:16:21.637 に答える
0

問題の原因とコードに応じて、考えられる解決策がいくつかあります。

  1. モーダル ループを実行する API を呼び出す前に、データ構造が一貫した状態であることを確認してください。
  2. それが不可能な場合は、単純なブール変数を使用して構造を保護できます。設定されている場合は、更新の試行を中止するか、後で更新するためにキューに入れます。もう 1 つのオプションは、前の操作を中止することです。
  3. 問題がユーザー生成イベントである場合は、操作の進行中に問題のあるメニューまたはボタンを無効にします。または、モーダル ダイアログを表示することもできます。
于 2009-06-04T20:13:05.560 に答える