2016-05-06 24 views
1

我正面临着如何在单独的进程中运行应用程序的不同部分的问题,因为QProcess的成员函数设置进程名称需要完整路径。C++ Qt在单独的进程中运行应用程序的部分

void setProgram(const QString &program) 

但我试图运行的过程基本上是主应用程序的一个模块。所以让我解释一下我想要基本实现的目标。

该应用程序具有QMainWindow作为中央窗口,它将控制所有不同的模块,监视它们,停止/重新启动它们,通过IPC机制与它们进行通信。

  1. 因此,例如,一个模块有一个QWebEngineView,将用户引导至某个网站,并管理该用户的会话信息(饼干,认证等),并让用户使用该网站像他通常会通过浏览器。
  2. 另一个模块将持续执行CPU密集型计算,而不会阻塞应用程序的任何部分。
  3. 另一个模块将呈现一个完整的Javascript图表应用程序。

等等。在这个应用程序中有很多这样的重量级模块,所以使用线程方法是不可取的,因为基本上这些模块需要在其单独的内存空间中运行,并且将充当MainWindow进程的子进程。使用D-Bus,SharedMemory可以很好地处理进程之间的通信。

但我不明白如何实际创建这些子进程,当用户点击MainWindow中的特定动作/按钮。再次,这些模块非常集成在一个应用程序中,并且由于安全性和完整性限制而无法在外部调用。所以,请让我知道任何方式来实现这一点。

+0

快速而肮脏的方法是将独立模块编译为独立应用程序,然后将其放入资源中,在运行时将它们作为临时文件编写并运行。 – Marco

+0

否则,如果你想它干净和复杂(也可能不是跨平台),我会看看这个:http://www.rohitab.com/discuss/topic/31681-c-run-program-from-memory-而不是文件/ – Marco

+0

是的,这是从内存中运行程序或子模块的想法,就像在单独的线程中运行一个函数一样。但是这是一个仅限于Linux的应用程序,并且永远不会在Windows上运行,所以我一直在寻找Linux特定的解决方案。 – Maxx

回答

2

一种方法是使用相同的可执行文件,并使用命令行参数控制启动哪个模块。在this answer中查看一个简单的例子。进程间通信可以使用本地套接字完成,也可以在进程间发送槽口调用 - 请参阅CuteIPC

+0

是的,这是确保整个应用程序保持与QProcess Qt兼容而不是使用fork()系统调用的最合乎逻辑和直接的方式。感谢您的回答。 – Maxx

相关问题