0

プロセス間通信を実装するアプリケーションを作成しています。この目的のために、私は共有バッファを設定しました。これは正常に機能しているようです。ここで、データ生成アプリケーション (c++ で記述) がデータ受信アプリケーション (freepascal/lazarus で記述) にいつデータを読み取る必要があるかを伝える方法が必要です。

この目的のためにミューテックスを使用しようとしていました。Windows API プログラミングの経験はあまりありません。

したがって、私の問題は、以下の FreePascal コードでは、ミューテックスが待機しないことです。TMutex.Wait() 関数を呼び出すことができます。エラーなどは返されませんが、単に待機しません。

コンストラクタ TMutex.Create(sName: AnsiString);
sNameを開始し
  ます:= 'Local\Mutex'+sName;
  hMutex := CreateMutexA(
        nil, // デフォルト アクセス
        True, // 最初は所有されていない
        PChar(sName)); // 名前付きミューテックス
  hMutex = 0 の場合は、例外の発生を
  開始します。Create
    ('mutex の作成に失敗しました');
  終わり;
終わり;

デストラクタ TMutex.Destroy;   CloseHandle(hMutex)
を開始します。 終わり; 手順 TMutex.Wait; begin   if (WaitForSingleObject(hMutex, INFINITE) <> 0) then ShowMessage('debug: 何かが返されるのを待つ'); 終わり;








手順 TMutex.Post;   ReleaseMutex(hMutex)
を開始します。 終わり;


4

2 に答える 2

2

あなたの問題は次の場所にあるようです:

    True, // initially not owned

あなたは物事を後方に持っています - true は最初に所有されていることを意味するので、それを待っているとすぐに戻ります。

于 2009-10-16T19:26:04.627 に答える
0

TMutex の Wait メソッドを呼び出すコードを示していません。ただし、ミューテックスは再入可能であることを知っておく必要があります。スレッドがミューテックスを所有している場合、常にそのミューテックスへのアクセスが許可されるため、待機がブロックされることはありません。これは、デッドロックを回避するためにミューテックスに組み込まれています。

別のスレッドからミューテックスを取得しようとすると、待機がブロックされます。

于 2009-11-04T06:01:26.133 に答える