私はC++のDLLを呼び出すC#アプリケーションを書いています。このdllはイメージングシステムのデバイスドライバです。画像が取得されるとき、画像のプレビューはライブラリから行単位で利用可能である。 C++ dllはプレビューを書き込むためにコールバックをとり、そのコールバックは基本的に最終イメージのサイズ、現在スキャンされている行、およびデータそのものから構成されます。C#のアプリケーションをC++のDLLにコールバックを介してC#のアプリケーションに戻す
問題は、スキャンが停止してからC#コールバックが情報を取得しなくなってから非常に深刻な遅延があることです。ユーザーがデータ
- 割り当てコールバック:プログラムの流れは次のようになります(通常)
- デバイスの画像の作成が完了しました。
- dllは、まだ画像形成の時間の2倍のコールバックを呼び出しています。
この同じDLLは、C++アプリケーションでうまく動作しました。その最後のステップの遅延ではないようです。しかし、C#では、コールバックをすぐに返すと、遅延はまだ存在します。私がコールバックの中で何をしても、それはそこにあります。
この遅延は管理されていないコードからマネージコードを呼び出す際の固有の制限ですか、これを速くするために両サイドでできることはありますか?私はC++ライブラリライターと接触しているので、C++側から修正を実装することは可能です。
編集:名前付きパイプのような簡単な作業はできますか?アプリケーションが独自のパイプから読み込むことはできますか?
コールバックがイメージごとに何度も呼び出されるようですね。幾つ?たぶん、これらの呼び出しを単一のコールバックにバッチすることができます。これは、C++ DLLがデータをバッファすることによって可能になります。 –
たぶん - C++ dllはバッファを宣言し、ポインタをC#アプリケーションに渡してから、アプリケーションが定期的にバッファから消費しますか? – mmr