2011-01-16 8 views
2

アンマネージドアルゴリズムクラス用のラッパークラスを作成中です。私は、結果の処理とオンザフライ表示に別々のスレッドが必要なところに来ました。C++/CLIスレッド同期(マネージコードとアンマネージコードを含む)

私は仕事をしている私の管理されていないクラスの1つの方法があります(私はそれを変更することはできません)。その中にメインループがあります。私の計画は、各反復の終わりに結果を描画できるようにすることでした。

System :: Threading :: Monitorメソッドを使用して同期を実行したかったのです。ただし、管理されていないクラスでは作成できない管理参照が必要です。どうすればその問題を解決し、スレッド同期を実行するのでしょうか?

答えて

2

クラスを管理対象に切り替えるか、管理対象外の同期オブジェクトを使用します。何らかの理由で管理対象のアルゴリズムを変更できない場合は、2つのクラスを持つことができます.1つは管理し、もう1つはアルゴリズムで管理しません。最初のものは、もう一方の機能を使用し、Monitorを使用して同期を提供します。

または、コード全体を管理しない場合は、同期のためにWindows APIに移動します。 MSDNの関数リストを参照してください。詳細については、CreateMutex、CreateSemaphoreおよびInitializeCriticalSectionを参照してください。ミューテックスとクリティカルセクションは、Monitorクラスが提供する単純なロックと非常によく似ています。 (実際には、Monitorは、シグナルと同じように動作するように実装されており、シグナリングの機能を追加しています。)シグナリングの詳細については、CreateEventを参照してください。

+1

申し訳ありませんが、これは明白な部分です。 WinAPI同期が最後の手段です。これまで私はSystem :: Threading :: Monitor :: Enter( "Lock1")を呼び出すことができました。 CLRでは単一のオブジェクトとして宣言または使用された回数にかかわらず文字列定数が保持されるため、このトリックを実行するアンマネージドクラスは使用できません。別の方法として、静的SyncRootを使用する方法があります。私は今それを試し、何が起こるか見る。 – kubal5003

+0

文字列定数のソリューションは本当にうまく動作します:) – kubal5003