2012-03-09 6 views
1

Windowsの異なるプロセス間に障壁を確立しようとしています。それらは本質的に同じプロセスの2つのコピーです(プロセスの代わりに2つの別々のスレッドとして実行することはオプションではありません)。 考え方は、プログラムの異なる段階に障壁を置いて、両方のプロセスが同時に各段階を開始することを確認することです。 Windowsでこれを実装する最も効率的な方法は何ですか?Windowsのプロセス間同期バリア

答えて

3

は(CreateEventとのWaitForSingleObject API関数を参照)という名前のイベントを使用してください。 1つのバリアにつき2つのイベントが必要です。それぞれのイベントは、アプリケーションの別のインスタンスで作成されます。次に、両方のインスタンスが互いのイベントを待機します。もちろん、これらのイベントは後で別の障壁のために再利用することができます。

しかし、1つの複雑さが存在する - イベント名は、(のは簡単のためにそう言わせて)グローバルに一意であるため、各イベントには、多分、インスタンスのプロセスIDで始まる、異なる名前を持っているでしょう。したがって、アプリケーションの各インスタンスは、別のインスタンスによって作成されたイベントの名前を見つけるために別のインスタンスのIDを取得する必要があります。

あなたは、ウィンドウアプリケーションを持っている場合は、最初のインスタンスの存在についてアプリケーションの2番目のインスタンスを通知するメッセージをブロードキャストすることができます。

+0

ありがとうございました。それは理にかなっている。私はちょうど2つのプロセスを使用しているので、私はインスタンスのプロセスIDを送信するために任意のIPCメソッドを使用できます。不思議なことですが、インスタンスの数が変わった場合、どのようにメッセージをブロードキャストしますか? – cloudraven

+1

@cloudraven迅速かつ汚い方法はBroadcastSystemMessage(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644932%28v=vs.85%29.aspx)を利用することです。正しい方法は、ウィンドウが列挙されている場合(メモリが使用されている場合はEnumWindows())、各ウィンドウにメッセージを送信することです。 –

+0

ManualResetイベントを使用する必要があることを覚えておきましょう。各プロセスの観点から、イベントを発生させようとしたときにイベントが発生していないことを確認してください(そうしないと、同期が失われます)イベントの再利用のために、WaitOne(0)を使用してステータスを確認することができます - それが真実で、少し眠ってからイベントを起こすだけです)。 [コード]一方(myEvent.WaitOne(0)){ のThread.sleep(10)。 } myEvent.Set() partnerEvent.WaitOne() partnerEvent.Reset()/コード] –

関連する問題