【问题标题】:C++/C# callback continuedC++/C# 回调继续
【发布时间】:2009-06-11 16:15:12
【问题描述】:

在问了this question 并且显然难倒了人们之后,这个想法怎么样 - 我可以将 C# 应用程序的缓冲区提供给 C++ dll,然后在 C# 中进行计时事件,只需复制缓冲区的内容出去?这样,我避免了显然发生的回调调用引起的任何延迟。这会起作用,还是编组会阻止这种缓冲区访问?或者我是否必须进入不安全模式,如果我这样做或不这样做,让它工作的神奇词是什么?

回顾另一个问题:

  • 我有一个用 C++ 编写的驱动程序和一个用 C# 编写的应用程序。
  • 我需要以预览方式从驱动程序获取数据。
  • C++ 应用程序与 C++ dll 交互很好; C# 应用在复制数据时有很大的延迟。
  • 延迟似乎不是由 C# 端的发布/调试差异引起的
  • 我需要绕过延迟。这个提议的缓冲方案能奏效吗? C# 应用程序是否可以从 C++ dll 写入的缓冲区中使用,还是我需要做其他事情?

【问题讨论】:

  • 考虑在原始线程中继续讨论。
  • 没有人查看原始线程:)(或者抱歉,35 人查看了)。

标签: c# c++ buffer sharing


【解决方案1】:

如果你愿意

  1. 在托管代码中使用非托管代码中的数据
    那么你就会遇到问题,除非你将它作为字节指针(不安全的代码)使用或者你复制一份(封送处理会为你做)。后者可能会拖慢您的速度(但不要猜测 benchmark)。

  2. 在非托管代码中使用托管代码中的数据
    那么这很简单,您只需要确保在非托管代码使用关联的缓冲区时将其固定。

听起来您希望这样做 1. 您是否对延迟进行了基准测试?如果是复制(不感兴趣的缓冲区有多大),那么您可以更改您的 c# 代码以作为字节指针(和长度)与缓冲区交互吗?
如果您可以访问 C++/CLI,您通常可以更干净地解决这个问题,因为更容易让部分代码不受管理(使用原始缓冲区),而管理的部分只使用它的子部分(仅复制什么是绝对需要的)

【讨论】:

    【解决方案2】:

    PInvoke 速度慢的主要原因以及解决此问题的方法见SuppressUnmanagedCodeSecurityAttribute

    【讨论】:

      【解决方案3】:

      是的,您可以将缓冲区(例如 byte[])从 C# 传递到 C++。我被你原来的问题难住了。我使用从我自己的 C++ 代码到 C# 的回调,但我从未注意到性能问题——尽管我尽量不在循环的每次迭代中执行回调,因为我确实预计会有一些编组开销。

      【讨论】:

        【解决方案4】:

        正如我在另一个帖子中所说,似乎延迟完全是在 C++ 方面,所以我的任何努力都无法解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2012-06-04
          相关资源
          最近更新 更多