2009-06-10 110 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通道 - 也许有点矫枉过正,但值得一看

希望帮助