2009-06-10 113 views
2

我正在寫一個C#應用程序,調用C + + DLL。這個DLL是一個成像系統的設備驅動程序;當圖像被採集時,圖像的預覽可以逐行從庫中獲得。 C++ dll需要一個回調來填充預覽,該回調基本上由最終圖像的大小,當前掃描的行和數據本身的行組成。C#應用程序到C + + dll回到C#應用程序通過回調

問題是,從掃描停止時間開始,C#回調停止獲取信息時會有相當嚴重的延遲。該計劃的流轉是這樣的:

  1. 分配回調到C++ DLL從C#中
  2. 用戶開始獲取數據
  3. 設備啓動
  4. DLL開始幾秒鐘後,調用回調(正常)
  5. 設備完成圖像形成
  6. dll仍然調用回調的圖像形成時間的兩倍。

這個dll與C++應用程序一起工作就好了;似乎沒有最後一步的延遲。但是,在C#中,如果我立即返回回調,則延遲仍然存在;不管我在回調中做什麼,它都在那裏。

此延遲是從非託管代碼調用託管代碼的內在侷限性,還是有任何一方可以做到這一點,使其更快?我正在接觸C++庫編寫器,因此可以從C++端實現修復。

編輯:可以做一些簡單的命名管道工作嗎?應用程序是否可以從自己的管道讀取?

+0

所以這聽起來像回調將被稱爲每個圖像多次?多少?也許你可以通過讓C++ DLL緩衝數據來將這些調用批量調用到單個回調中? – 2009-06-11 16:21:02

+0

也許 - 如C++ dll聲明緩衝區,將指針傳遞給C#應用程序,然後應用程序會定期從緩衝區中使用? – mmr 2009-06-11 16:42:47

回答

0

原來,這個延遲發生在C++方面,一位開發人員發誓並非如此。

0

你是否在跨interop層進行任何時髦的數據編組?如果是這樣,那麼你可能會有很大的延遲,而它基本上是通過轉換所有圖像數據來編組。您可以輕鬆地測試此爲一體的大型的圖像數據,時間越長,將採取

映入腦海的一些可能的替代方案是
1.使用內存映射文件,雖然你需要實現一個簡單的信號或信號系統說「我有數據準備好」和「我已經使用了數據」
2.以混合模式編譯C++ dll(任何C++代碼都可以使用/ clr標誌編譯爲.NET)然後使用C#/ CLI
3.使用遠程處理和IPC通道 - 也許有點矯枉過正,但值得一看

希望幫助