在Windows平台下使用命名管道( C++/C# )

4
我有一个C++应用程序,需要实时从网络摄像头发送图像到同一台PC上的C#应用程序。由于C++代码无法从C#代码中调用,因此我需要通过命名管道进行通信,以便传输图像。
我以前没有进行过任何通信编程,想知道如何解决这个问题。我的第一个想法是让C++应用程序在单独的线程上创建命名管道服务器,在创建后,该线程将持续等待直到有可用的图像要发送。然后它会发送图像。
类似地,C#应用程序将创建一个新线程作为客户端。它将连接到服务器并持续循环,直到有图像可用。然后它将接收图像并将其存储在主线程可以访问的队列中。
这种方法合理吗?这是最好的方法吗?

1
好问题,但我认为它更适合放在programmers.stackexchange.com上。这比通常在这里发布的更具概念性。 - NotMe
如果您需要永久存储这些图像,内存映射文件可能是更好的方法。 - Flot2011
在C++应用程序的每个帧上,我会将整个图像存储在一个命名的内存映射文件中,然后可以从C#应用程序中读取它?对于处理读写内存映射文件,我是否仍需要在每一侧创建一个新线程,就像上面所述? - Jkh2
1
无论您使用什么解决方案来通过磁盘文件传输数据,都可以应用于内存映射文件。个人而言,我会等待一个[Event]信号(而不是创建线程和轮询)。 - AVIDeveloper
你的想法听起来不错。或者,如果你熟悉COM,你可以用C++制作一个COM组件,让.NET可以访问,并且速度相对较快。 - user585968
1个回答

0

我赞同在这里使用COM的想法。说实话,我会用C#编写COM对象,因为它比C++更容易。C#具有出色的COM互操作性。请参见http://msdn.microsoft.com/en-us/library/aa645712%28v=vs.71%29.aspx。我编写了一个类似于MS VSS COM接口的工作接口,可以由Python(我们的构建系统)调用,与另一个供应商公开的C# .NET接口进行交互;因为它是低级别的COM,所以也可以从JScript、C++等调用。

除非您要进行机器间通信和/或需要Windows安全性作为其中一部分,否则我会避免使用命名管道,尽管您实际上用于跨越对象的传输可以是任何东西,可能由涉及的大小/速率决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接