如何从 QT(C++)中的子进程联系父进程以执行类中的方法?

Posted

技术标签:

【中文标题】如何从 QT(C++)中的子进程联系父进程以执行类中的方法?【英文标题】:How to contact parent process from child in QT (C++) to perfom method from class? 【发布时间】:2011-03-17 10:05:58 【问题描述】:

我有一个问题。我目前正在使用 QT (C++) 编写程序,但我遇到了这个问题。如果我选中复选框,它会启动一个方法,在哪里实现 fork()。父进程继续到最后(保持解冻的 GUI)。子进程在无限循环中工作。完成一个序列后,我将必要的数据存储到共享内存中。现在我需要联系父进程从共享内存中读取数据并在 GUI 上打印。我尝试了信号、管道、信号量……我的问题是……我需要联系父进程,我需要让他进入课堂,这是一种打印 GUI 输出的方法。如果我使用信号处理程序,就没有机会回到班级(我需要共享内存的 ID 才能连接)。我希望我的问题可以理解。我需要找到一个解决方案,在那里我可以联系父进程(例如 QT 中的 connect() )并从类中调用必要的方法。

【问题讨论】:

【参考方案1】:

您可以使用消息 (mq man pages),也可以进行投票。如果设置了共享内存中特定偏移量的值,则表示子进程结束,共享内存中的数据准备就绪。

【讨论】:

【参考方案2】:

我可能解决这个问题的方法是让 GUI 在主线程中运行,然后在选中复选框时启动 QThread。此 QThread 可以根据需要连续运行,也可以通过复选框停止和重新启动。

处理完成后,如果数据量很小,可以使用thread-safe signal 将数据传输到 GUI 线程,并且 GUI 线程上的插槽可以更新显示。如果有很多数据(正如您在问题中暗示的那样),请使共享内存对两者都可用(通过将其放在单独的模块中或使用创建 QThread 对象时创建的指针)并保护对共享QMutex 的内存。这个 QMutex 可以在 GUI 线程中创建,然后在创建时传递给工作线程。当数据准备好进行处理时,可以从工作线程向 GUI 线程发送线程安全信号,并且 GUI 线程中的插槽可以锁定(或 tryLock)QMutex,从共享内存中获取数据,然后解锁QMutex(并且可能会向工作线程发送一个信号以告诉它继续)。

【讨论】:

非常感谢!我像你写的那样更改了我的代码(实现 QThread 而不是 fork)。一切正常!真的再感谢一次!

以上是关于如何从 QT(C++)中的子进程联系父进程以执行类中的方法?的主要内容,如果未能解决你的问题,请参考以下文章

fork 和 signal:如何将信号从父进程发送到特定的子进程

父进程全局变量如何复制到python多处理中的子进程

关于父子进程的执行顺序和执行过程

shell多进程实例

C++中如何实现子进程打开控制台窗口

(疑问)进程控制---vfork 函数