Hei*_*cht 8 windows delphi ipc image marshalling
目标
将一个过程生成的图像高效且高速地传递到另一个过程.这两个进程在同一台计算机上运行,并在同一桌面上运行.操作系统可能是WinXP,Vista和Win7.
详细说明
第一个过程仅用于控制与产生图像的设备的通信.这些图像大小约为500x300px,每秒可更新数百次.第二个过程需要这些图像来处理它们.第一个过程使用第三方API将图像从设备绘制到HDC.这个HDC必须由我提供.
注意:两个进程之间已建立连接.它们通过匿名管道进行通信并共享内存映射文件视图.
思考
如何以尽可能少的工作实现这一目标?我的意思是既为计算机工作又为我工作(当然;)).我正在使用Delphi,所以也许有一些组件可用于这样做?我想我总是可以绘制到任何图像组件的HDC,将内容保存到内存流,通过内存映射文件复制内容,在另一侧解压缩并将其绘制到目标HDC.我还读到了一个可用于编组图像的IPicture界面.我需要尽可能快,所以开销越小越好.我不希望仅通过复制一些图像来强调机器.
你有什么想法?我很欣赏这一切!
Pet*_*ron 11
使用内存映射文件.
对于一个Delphi参考看到内存映射文件在Delphi和在Delphi共享内存.
对于更通用的方法,您可以查看使用管道或通过TCP发送位图数据.如果需要,这将允许您更容易地在节点之间分发图像数据.
好吧,看来内存映射文件和管道是正确的选择。这还不错,因为两个进程已经共享一个 MMF 和两个管道(用于双向通信)。唯一需要解决的问题是如何以尽可能少的复制操作来传递数据。
效果很好的设计如下(顺序流程):
流程1(想要图像)
流程2(提供图片)
流程1(想要图像)
现在通过共享内存进行图像传输(我的目标是使用不超过一个额外的复制操作):
进程2创建一个HBITMAP过孔CreateDIBSection并提供文件映射的句柄和映射视图的偏移量。因此,图像数据存在于共享内存中。这将创建一个HBITMAP被选入 HDC 1 的对象(它也是由进程 2 创建的),并且从现在开始将由进程 2 使用。
进程 1 使用StretchDIBits指向映射视图内存的指针(如此处所述)。这似乎是从内存直接获取位到另一个 HDC(在本例中为 HDC 2)的唯一函数。其他函数会首先将它们复制到某个中间缓冲区中,然后再将它们从那里传输到最终的 HDC。
所以最后看起来需要传输的位数大约是开始时的两倍。但我认为这已经是最好的了,除非可以在进程之间共享 GDI 句柄。
注意:我使用管道而不是信号,因为我还需要传输一些额外的数据。
| 归档时间: |
|
| 查看次数: |
3293 次 |
| 最近记录: |