Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Most efficient way to send images across processes

Goal

Pass images generated by one process efficiently and at very high speed to another process. The two processes run on the same machine and on the same desktop. The operating system may be WinXP, Vista and Win7.

Detailed description

The first process is solely for controlling the communication with a device which produces the images. These images are about 500x300px in size and may be updated up to several hundred times per second. The second process needs these images to process them. The first process uses a third party API to paint the images from the device to a HDC. This HDC has to be provided by me.

Note: There is already a connection open between the two processes. They are communicating via anonymous pipes and share memory mapped file views.

Thoughts

How would I achieve this goal with as little work as possible? And I mean both work for the computer and me (of course ;)). I am using Delphi, so maybe there is some component available for doing this? I think I could always paint to any image component's HDC, save the content to memory stream, copy the contents via the memory mapped file, unpack it on the other side and paint it there to the destination HDC. I also read about a IPicture interface which can be used to marshal images. I need it as quick as possible, so the less overhead the better. I don't want the machine to be stressed just by copying some images.

What are your ideas? I appreciate every thought on this!

like image 421
Heinrich Ulbricht Avatar asked Mar 29 '10 07:03

Heinrich Ulbricht


3 Answers

Use a Memory Mapped File.

For a Delphi reference see Memory-mapped Files in Delphi and Shared Memory in Delphi.

For a more versatile approach you can look at using pipes or sending bitmap data via TCP. This would allow you to distribute the image data between nodes more easily, if necessary.

like image 116
Petrus Theron Avatar answered Nov 17 '22 18:11

Petrus Theron


Use shared memory to pass the image data, and something else (named pipes, sockets, ...) to coordinate the handover.

like image 42
Marcelo Cantos Avatar answered Nov 17 '22 20:11

Marcelo Cantos


In some cases, you can pass HBITMAP handles across processes. I've seen it done before (yes, on XP/Vista), and was surprised as everyone else on the team when one of my co-workers showed me.

If memory serves me correctly, I believe it will work if the HBITMAP was allocated with one of the GDI function (CreateBitmap, CreateCompatibleBitmap,CreateDIBitmap,etc...) HBIMAP handles created by LoadBitmap will not work as it's just a pointer to an in-proc resource.

That, and I think when you share the HBITMAP across to the other process, don't try to do anything special with it other than normal BitBlt operations.

At least that's what I remember. We got lucky because our graphic libraries were already written to manage all images as HBITMAPs.

YMMV

like image 3
selbie Avatar answered Nov 17 '22 19:11

selbie