2009-06-10 10 views
2

私はC++のDLLを呼び出すC#アプリケーションを書いています。このdllはイメージングシステムのデバイスドライバです。画像が取得されるとき、画像のプレビューはライブラリから行単位で利用可能である。 C++ dllはプレビューを書き込むためにコールバックをとり、そのコールバックは基本的に最終イメージのサイズ、現在スキャンされている行、およびデータそのものから構成されます。C#のアプリケーションをC++のDLLにコールバックを介してC#のアプリケーションに戻す

問題は、スキャンが停止してからC#コールバックが情報を取得しなくなってから非常に深刻な遅延があることです。ユーザーがデータ

  • デバイスの起動を取得する
  • DLLが数秒後にコールバックを呼び出すために開始し開始しますC#
  • 内からC++ DLLへ

    1. 割り当てコールバック:プログラムの流れは次のようになります(通常)
    2. デバイスの画像の作成が完了しました。
    3. dllは、まだ画像形成の時間の2倍のコールバックを呼び出しています。

    この同じDLLは、C++アプリケーションでうまく動作しました。その最後のステップの遅延ではないようです。しかし、C#では、コールバックをすぐに返すと、遅延はまだ存在します。私がコールバックの中で何をしても、それはそこにあります。

    この遅延は管理されていないコードからマネージコードを呼び出す際の固有の制限ですか、これを速くするために両サイドでできることはありますか?私はC++ライブラリライターと接触しているので、C++側から修正を実装することは可能です。

    編集:名前付きパイプのような簡単な作業はできますか?アプリケーションが独自のパイプから読み込むことはできますか?

  • +0

    コールバックがイメージごとに何度も呼び出されるようですね。幾つ?たぶん、これらの呼び出しを単一のコールバックにバッチすることができます。これは、C++ DLLがデータをバッファすることによって可能になります。 –

    +0

    たぶん - C++ dllはバッファを宣言し、ポインタをC#アプリケーションに渡してから、アプリケーションが定期的にバッファから消費しますか? – mmr

    答えて

    0

    遅れがC++側にあることが判明しました。

    0

    ゴミ収集対象のネイティブのコールバックをチェックするマネージドデバッグアシスタントが犯人である可能性もありは(それがデバッガでデバッグモードになっている?)

    マイク・ストールによってPSA: Pinvokes may be 100x slower under the debuggerブログエントリを参照してください。

    +0

    私は主なアプリケーションとDEBUG off、TRACE off、Optimize onでコンパイルされたすべてのライブラリを持つRelease設定で動作しています。だから、各ソリューションのプロパティページによると、いいえ、私はデバッグではありません。これはまたvs2008です、それは重要ですか? – mmr

    +0

    また、vs2008内の便利な緑色の矢印を使用するのではなく、実行可能ファイルをダブルクリックして実行しています。 – mmr

    +0

    C++開発者と作業できる場合は、混在モードのデバッグを有効にして問題を追跡できるかどうかを確認してください。 –

    0

    interopレイヤー間でファンキーなデータをマーシャリングしていますか?もしそうならば、それは基本的にそれを変換することによってすべての画像データを整列している間、あなたは巨大な遅延を持つかもしれません。あなたは簡単に長く、それが心に春

    いくつかの可能な選択肢を取る、大きな画像データとしてこれをテストすることができますが、簡単なセマフォを実装する必要があると思いますけれども、メモリマップドファイル1.Use
    です「データ準備ができています」と「データを消費しました」というメッセージが表示される 2. C++のDLLを混在モードでコンパイルします(C++コードは/ clrフラグを付けて.NETにコンパイルできます)。
    3.リモーティングおよびIPCチャンネル - 多分やり過ぎのビットが、

    を助け一見の価値

    ・ホープ