IPC:Qt 和 MONO 进程之间的通信(在 linux 上)

Posted

技术标签:

【中文标题】IPC:Qt 和 MONO 进程之间的通信(在 linux 上)【英文标题】:IPC: Communication between Qt and MONO processes (on linux) 【发布时间】:2010-05-07 08:02:58 【问题描述】:

我必须将 Qt4 应用程序连接到单声道应用程序。当前的概念验证使用网络套接字(这很好,我可以在命令行上使用nc 进行调试)。

但我愿意接受新的建议。我的替代方案是什么?

编辑:

原来的应用栈分为两部分:服务器+客户端。客户端应该显示图片和视频。由于我们发现这在 Mono 中是不可能的,因此我们将客户端分为两部分:

服务器 -> 客户端 -> 图形用户界面

在最初的实现中,客户端+GUI 是同一个应用程序。现在客户端在 C# 中(在 Mono 上运行),GUI 是 Qt4。在 Qt4 中重写客户端不是一种选择。

现在客户端和 GUI 之间的通信是通过 localhost 使用 TCP 套接字完成的。我正在寻找更好的实现方式。

编辑2: 虽然该应用程序当前在 linux 上运行,但我也想在 Windows 上安装这个系统。客户端(有一个监听套接字...)在 Win32 上工作,Qt4 是跨平台的。

【问题讨论】:

是的,它确实看到了:doc.trolltech.com/latest/qlocalsocket.html 【参考方案1】:

你可以:

    使用Mono embedding API 将 Mono 嵌入到您的(可能是 C++)Qt 4 应用程序中。 通过从 GUI 公开 C API 来反转 (1),以便您可以使用 P/Invoke 从 Mono 代码控制它。 混合使用 (1) 和 (2) - 嵌入 Mono,使用嵌入 API 调用它,让它使用 P/Invoke 回调。 使用其他 IPC 机制,例如 Unix 套接字或共享内存,这可能更快,并且可以避免阻塞 IP 端口。

我推荐 (3)。

【讨论】:

我不认为 Qt 的事件循环会喜欢在 Mono 进程中运行。另一种方式也一样,这是否记录在任何地方?因为这已经过测试了? 这有什么关系?只需将其视为从 C/C++ 调用 Mono 方法并从 Mono 调用 C 函数。当然,您可以在 Mono 方法中阻止主循环,但您可以在 C++ 函数中同样轻松地阻止它(尤其是使用 TCP IPC)。 Qyoto 从 Mono 运行 QT 主循环,GTK# 从 Mono 运行 GTK 主循环,等等。 好吧,我认为这是可能的,但这意味着在同一个应用程序中混合两个不同的子域。我对此不满意,请参阅我写给 Sharique 的 Qoyoto 项目的回复。我认为(4)是最好的方法.... 只要你在两个语言域之间有一个干净、定义明确的接口,我看不出它与使用 IPC 有什么不同。它会快很多,而且您不必为运行两个进程而头疼。 要了解它可能与 IPC 有多么相似,请考虑定义一个 C# 方法 byte[] MakeCall (byte[] data)。您的 C++ 代码将获得 MonoMethod 的句柄,然后对于每个调用,您将参数编码为 MonoArray,调用 MonoMethod,并解码生成的 MonoArray。这与同步网络 IPC 没有太大区别。【参考方案2】:

你可以使用 Qyoto 用 C# 编写完整的项目,你不需要用 2 种 diff 语言编写代码,在 C# 中访问原生 api 是一项非常复杂的任务并且需要很多时间。

您可以使用Qyoto,它是用于 Qt 的 C# 绑定。 MonoDevelop 有一个 Qyoto 插件,名为 'QyotoDevelop'。

【讨论】:

我对此表示反对,因为您没有回答我的问题。问题是一个原始应用程序是用 C#/win32 编写的,现在除了 GUI 之外,linux 端口确实可以工作。不,客户端将 GUI 应用程序分成两部分,与服务器对话的后端和我正在编写的 GUI。他们不想接触后端——我接受这个决定。现在我的问题是后端和前端之间的通信。 您必须指定此问题。后端是用哪种语言编写的?你在 MOMA 检查过你的申请了吗?

以上是关于IPC:Qt 和 MONO 进程之间的通信(在 linux 上)的主要内容,如果未能解决你的问题,请参考以下文章

Qt 和 C/C++ 之间的 IPC

进程和线程之间的通信

多个相同进程之间的 IPC 通信

《Python》进程之间的通信(IPC)进程之间的数据共享进程池

IPC在两个不相关的节点js进程之间使用共享内存通信

可以比 IPC 或套接字更直接地在进程之间进行通信吗?