2009-12-06 4 views
9

私たちは、プラグイン「アーキテクチャ」を備えたアプリケーションを開発しています。独自の独自のアルゴリズムを提供します。クロスプラットフォームのインプロセスダイナミックライブラリバインディング(軽量で高性能なCOMまたはCORBA)のC++ラッパーの推奨事項

ドメインスペースには非常に高いパフォーマンスが要求されるため、アウトプロセスバインディングは機能しません。私たちは残しておきます。 CORBAやCOMだけのようなヘビー級のもの。基本的に私たちは周りのシンプルなクロスプラットフォームのラッパーを探している

  • ロードライブラリを相対パス
  • からは、いくつかの設定/名前
  • に/ .soは、特定のDLLのマッピングを提供します
  • ライブラリを初期化してクエリを実行し、必要な機能を提供するようにします。

これは実際にはloadlibrary()とメソッド呼び出し輸出された。私たちはこれを自分で書くことができますが、私たちは十分に既存のコードを使用しています。

再び、スループットとパフォーマンスは非常に重要です。プロセスのうち、当社のニーズの必要はほとんどない「軽量化」ではない - この1つは近いですが、私たちはインプロセスでのみたい -

Cross-platform alternative to COM

同様の質問があります。

C++ Cross Platform Dynamic Libraries; Linux and Windows

これは、アンマネージC++のためである - 私たちは

見つけたものを私たちは、Pocoは、私たちのニーズに素晴らしい作品ことがわかった - 私たちは、.NET

EDITを使用することはできません。ボーナスとしてThis pageは、C++開発の状況と言語の方向性について高く評価されています。

ポコが提供する必要があったシンプルなクロスプラットフォームラッピングでした。実際にはそれほど多くはありませんが、私たちは時間とテストを節約します。実行時に追加のオーバーヘッドはありません。

+1

、私は誰もがインプロセスのために明示的にこれを行うには気にしているとは思いません。 XPCOMは最高のものです。 –

+0

pocoがトリックをしているようです – Tim

+0

@Tim:私のコメントは、アプリの消費者が独自のアルゴリズムを提供できるように、_aプラグインの "architecture"というアイデアに関連しています._私のプロジェクトは同じ機能を目指していますが、ユーザコードが無限ループを通過すると、使用されたコードが実行されるスレッドがCPUの1つのコアをロックしてパフォーマンスを低下させる重大な問題があります。どのようにこのスレッドを停止する必要があります。あなたは同じ問題を抱えていますか?はいの場合、あなたの解決策は何ですか? –

答えて

4

ACEライブラリには、クロスプラットフォームで動作する動的ライブラリ読み込み用のラッパーが含まれています。 プレーンロードライブラリよりも快適な場合は、TAO ACE ORBを参照してください。 TAOでcorbaを使用すると、パフォーマンスが高くなります。特に、TAOが最適化したプロセスコールで使用する場合は、プラグインインフラストラクチャよりも優れています。

動的ライブラリクロスプラットフォームラッパーを使用するには、ACE_DLLを使用します。あなたが言及したloadlibrary()の周りに最も基本的なクロスプラットフォームラッパーを提供します。

ACE_DLLとTAOの間には、ACEのservice configuration frameworkがあり、オブジェクトを動的に読み込むことができます。ロード後、実装したロードされたオブジェクトへのアップキャストポインタを取得し、ロードされたオブジェクトの任意のメソッドを呼び出すことができます。

次のようになりそれを行うためのコード:

char const * const cpc_myClass = ACE_DYNAMIC_SERVICE_DIRECTIVE(
    "myclass", 
    "dllname", 
    "_make_MyClass", 
    "" 
); 
result = ACE_Service_Config::process_directive(cpc_myClass); 
MyClass * p_obj = ACE_Dynamic_Service<MyClass>::instance ("myclass"); 
p_obj->callAnyMethodYouLike(); 

Hereは、TAOがコロケーションの最適化の2種類(thru_poaと直接的に)知っていると説明されています

ダイレクト戦略を使用して、連鎖されたオブジェクトのメソッド呼び出しは、POAの状態をチェックすることなく、サーバントへの直接呼び出しになります。

TAOが正しく使用された場合、どれほど効果的か驚くかもしれません。私は概念の簡単な証明を作成し、測定を行うことを提案します。

+0

私はACEに精通しています - 私は "ヘビー級"のクロスプロセスやクロスマシンバインディングは必要ありません。私はACEが1つの仮想通話のパフォーマンスの近くにあるとは想像もしません。 ACEコールのオーバーヘッドは何ですか? – Tim

+1

ACE_DLLクラスを使用する場合、クロスプロセスコールはまったくありません。おそらく、あなたはACEに十分に精通していないでしょうか? TAOを使用しても、呼び出されたオブジェクトが同じプロセスにあるときは、基本的に仮想呼び出しを行う「直接」マッピングを生成できます。 – lothar

+0

+1 ACEをcorbaの実装として使用しました - ace_dllではありません - 提案に感謝 – Tim

関連する問題