3

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

回顾另一个问题:

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

4 回答 4

2

如果你想

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

  2. 在非托管代码中使用托管代码中的数据
    然后这很简单,您只需确保在非托管代码使用相关缓冲区时固定相关缓冲区。

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

于 2009-06-11T17:39:47.560 回答
1

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

于 2009-06-11T16:57:59.673 回答
0

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

于 2009-06-11T16:42:00.710 回答
0

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

于 2009-09-24T19:08:06.847 回答