【发布时间】:2009-06-10 23:28:00
【问题描述】:
我正在编写一个调用 C++ dll 的 C# 应用程序。此 dll 是成像系统的设备驱动程序;获取图像时,可从库中逐行预览图像。 C++ dll 需要一个回调来填充预览,该回调主要由最终图像的大小、当前扫描的行和数据行本身组成。
问题是,从扫描停止和 C# 回调停止获取信息的时间开始存在相当严重的延迟。程序的流程是这样的:
- 在 C# 中为 C++ dll 分配回调
- 用户开始获取数据
- 设备启动
- dll 几秒后开始调用回调(正常)
- 设备完成成像
- dll 仍在为双倍图像形成时间调用回调。
同样的 dll 可以在 C++ 应用程序中正常工作;最后一步似乎没有延迟。但是,在 C# 中,如果我让回调立即返回,则延迟仍然存在;无论我在回调中做什么,它都在那里。
这种延迟是从非托管代码调用托管代码的固有限制,还是任何一方都可以做些什么来加快速度?我正在与 C++ 库编写者联系,因此可以从 C++ 端实现修复。
编辑:可以做一些简单的事情,比如命名管道吗?应用程序可以从自己的管道中读取吗?
【问题讨论】:
-
所以听起来每个图像都会多次调用回调?多少?也许您可以通过让 C++ DLL 缓冲数据来将这些调用批处理到单个回调中?
-
也许——如C++ dll声明缓冲区,将指针传递给C#应用程序,然后应用程序定期从缓冲区消费?