2009-06-11 83 views
2

在詢問this question並明顯地困住了人後,我怎麼會這樣想 - 我可以從C#應用程序緩衝到C++ dll,然後在C#中有一個計時事件,只需複製內容緩衝出來了嗎?這樣,我就避免了顯然發生的回調調用造成的任何延遲。這會起作用,還是編組會妨礙這種緩衝區訪問?或者我將不得不進入不安全模式,如果我做或不做,將會有什麼神奇的詞讓它工作?C++/C#回調繼續

要從其他問題回顧:

  • 我已經寫在C++驅動程序和C#編寫的應用程序。
  • 我需要以預覽式的方式從驅動程序獲取數據。
  • C++應用程序與C++ dll交互就好了; C#應用程序有很大的延遲來複制數據。
  • 延遲似乎不是由C#端發佈/調試差異引起的
  • 我需要避開延遲。這個建議的緩衝方案能起作用嗎C#應用程序能否從C++ dll寫入的緩衝區中消耗,還是需要做其他事情?
+0

請考慮在原始線程中繼續此討論。 – 2009-06-11 16:19:12

回答

0

正如我在另一個線程中所說的那樣,延遲完全在C++端,所以在我的結尾沒有任何討論可以解決這個問題。

0

是的,你可以將一個緩衝區(例如。byte [])從C#傳遞給C++。我被你最初的問題困住了。我使用從我自己的C++代碼到C#的回調函數,並且我從來沒有注意到性能問題 - 儘管我試圖不在循環的每次迭代中執行回調,因爲我期望有一些編組開銷。

2

如果你想

  1. 消耗從非託管代碼數據託管代碼
    然後你有一個問題,除非你使用它作爲一個字節的指針(不安全的代碼),或者你把副本(編組將爲你做)。後者可能會降低你的速度(但不要猜測基準)。

  2. 消耗非託管代碼從託管代碼數據
    然後,這是非常簡單,你只需要確保你的腳相關緩衝區,而它正在使用的非託管代碼。

聽起來像你想要做的1.你有沒有基準延遲?如果是複製(有多大的緩衝區不感興趣),那麼你可以改變你的c#代碼作爲一個字節指針(和長度)與緩衝區交互?
如果您有權訪問C++/CLI,則通常可以更乾淨地解決此問題,因爲部分代碼不受管理(使用原始緩衝區)並且管理的部分僅與其子部分一起工作更容易只複製絕對需要的東西)