2011-10-24 8 views
0

は、私は次のような構造を持っているC++アプリケーションを持っているスレッドを開き、いくつかの機能とそれらの機能の一つを持っています。 クラスBBB:いくつかの関数を持ち、そのうちの1つがスレッドを開く関数です。 クラスCCC:関数内で内部的に両方ともトレッドを開くAAAとBBBを呼び出します。C++マルチスレッドとイベント

AAAスレッドでは、トレッドを終了してBBBとCCCの両方に通知したいことが分かっている場合もあります。 私はスレッド(Win32Thread)にあるので、私はスレッドで実行しているvoid関数なので、CCCに値を返すことはできません。

私はC++を新しくしましたが(C#の領域から来ています)、それを行う方法がわかりません。 (通知) 注:私はこの構造を変更することはできません。私は、クラスの機能を少し変更するだけです。それはトレッドと大きなコードを実行する大きなプロセスです。

可能であれば汚れていないでください:)

サンプルを追加すると私は非常に手助けします。

答えて

0

私はあまりにもあなたの問題を理解していない、あまりにも一般的です。 あなたは、どのような種類のマルチスレッドライブラリを使用しているのか指定していません。

スレッド間でメッセージを送信するには、通常、メッセージキューを使用し、待機ハンドル、ロック、セマフォを使用してメッセージを同期させます。

スレッド間でメッセージを送信するには、安全なマルチスレッドキューが必要です。

一つの可能​​な解決策:

それは例えば待機イベントを通じてアイドル状態にある場合、それを目覚め、スレッドBのキューにそれをエンキューすることによってBをスレッドにメッセージを送信する必要がスレッド場合。 スレッドBがメッセージを受信し、Aキューに別のメッセージをポストすることに応答します。

別の可能な解決策:

スレッドBをスレッドにメッセージを送信し、応答が受信されなくなるまで、スレッドAをブロック、応答を必要とする必要があります。 スレッドAはスレッドBのキューにメッセージをエンキューします。メッセージオブジェクトは関数スタックに置くことができます。次に、スレッドBがアイドル状態にある場合にスレッドBを起動し、たとえば、待機ハンドルまたはセマフォを介して待機状態に入ります。 スレッドBは、メッセージをデキューするとき、スレッドAが送信したオブジェクトに応答を書き込み、スレッドAを待機状態から起動します。 オブジェクトフィールドは、2つのスレッドによってread \ writeのためにアクセスされるため、volatileとしてマークする必要があります。 スレッドAはメッセージオブジェクトに格納されている値を使用し、スタックからオブジェクトを削除します。

サウンドは複雑ですが、実装は非常に簡単です。

Windows OSの場合は、ウィンドウごとのメッセージキューを使用して、スレッドごとに1つの目に見えないメッセージウィンドウを作成できます。最初のケースではPostMessage、2番目のケースではSendMessageを使用します。

0

Windows固有の解決策を恐れていない場合は、スレッドからPeekMessage()に電話してください。これにより、Windowsメッセージキューが作成されます。 (メインスレッドには既に1つあります)。今すぐSendMessage()を使用してAAAから他のスレッドにメッセージを送信できます。クラスではなくスレッドに送信していることに注意してください。 GetMessage()への通話にはメッセージが表示されます。

0

私がスレッドに使用する典型的な設計は、それを含むクラスのインスタンス(そのスレッドのインスタンス変数も含む)を渡すスレッド関数です。これはあなたの場合ですか?スレッドには、クラスのインスタンスが渡されていますか?そうであれば、外部からのものを追跡し、停止するときにフラグを立てるBOOLプロパティを入れてください。スレッドのメインループでは、フラグをチェックして、ビジネスがもう一度ループしているかどうかを確認するだけです。これは、スレッドを終了する唯一のきれいな方法です。