Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
https://www.cnblogs.com/bclshuai/p/11380657.html
1.需求描述
Qt主进程启动之后,在启动一个程序的四个子进程,子进程关闭时,会通过状态改变信号,通知主进程的槽函数,实现删除子进程的管理QProcess* 变量;
2.Qt进程QProcess介绍
2.1进程启动方式
有两种启动方式,start是父子进程关联启动子进程。startDetached则是以分离的方式启动进程。
void start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite);
void start(const QString &command, OpenMode mode = ReadWrite);
void start(OpenMode mode = ReadWrite);
static bool startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory
static bool startDetached(const QString &program, const QStringList &arguments); // ### Qt6: merge overloads
static bool startDetached(const QString &command);
3.实现步骤
(1)创建QMap保存进程的QProcess* 变量;
QMap<int,QProcess*> m_processMap;
(2)主进程中获取子进程路径,通过for循环启动四个子进程,并传入命令行参数,同时将for循环的ii值作为map的key值,用于标记是哪个进程。绑定stateChanged信号槽,之前打算用finish信号,但是finish信号有个重载函数,所以使用connect连接时,&QProcess::finished,无法判断是哪个函数,所以不行。如果用SIGNAL(finish(int exitCode)),又无法用SLOT去定义lamlar表达式。为了实现i序号作为进程的标识id,进程状态改变时,触发信号,可以定位到时那个进程结束了,直接在map中删除该进程变量。就可以了方便实现主进程和子进程之间的管理
void finished(int exitCode); // ### Qt 6: merge the two signals with a default value
void finished(int exitCode, QProcess::ExitStatus exitStatus)
QString strProcessPath = QDir::currentPath() + "/AlgAnalyizeTool/AlgAnalyizeTool.exe";//AlgAnalyizeTool.exe
if (!QFile(strProcessPath).exists())
{
QMessageBox::information(NULL, "提示", "分析进程不存在", QMessageBox::Yes, QMessageBox::Yes);
return;
}
for (int i = ; i < ; i++)
{
QJsonObject jsonMain;
QJsonObject serverConf;
QJsonObject videoAnalyizeConf;
videoAnalyizeConf.insert("cpuCores", );
videoAnalyizeConf.insert("gpuNo", i);
videoAnalyizeConf.insert("threadCount", );
serverConf.insert("ip", "10.25.106.103");
serverConf.insert("port", );
serverConf.insert("sessionId", QString::number(i));
jsonMain.insert("serverConf", serverConf);
jsonMain.insert("videoAnalyizeConf", videoAnalyizeConf);
QJsonDocument root_Doc;
root_Doc.setObject(jsonMain);
QByteArray root_str = root_Doc.toJson(QJsonDocument::Compact); //紧凑格式 // QByteArray root_str = root_Doc.toJson(QJsonDocument::Indented); //标准JSON格式 QString strJson(root_str); QString strJson((root_str.toBase64()));
QStringList Qstringlist;
Qstringlist << strJson;
QProcess* process=new QProcess(this);
connect(process,&QProcess::stateChanged, this, [=](QProcess::ProcessState state) {
if (state== QProcess::ProcessState::NotRunning)
{
QMap<int, QProcess*>::iterator it = m_processMap.find(i);
if (it != m_processMap.end())
{
delete it.value();
m_processMap.erase(it);
}
}
});
LOG_TRACE("start begin! ");
process->start(strProcessPath, Qstringlist);
m_processMap[i] = process;
LOG_TRACE("start end! ");
}
4.注意事项
4.1.主进程退出前先关闭子进程并释放资源
以start方式启动的子进程,需要在主进程关闭的析构函数中关闭主进程,并且删除new出的进程指针变量;才可以正常退出。否则,资源管理器中会保留主进程和子进程。导致程序无法覆盖或编译生成报错。
QMap<int, QProcess*>::iterator it = m_processMap.begin();
for (;it!=m_processMap.end();it++)
{
it.value()->terminate();
delete it.value();
}
m_processMap.clear();
QString strProcessPath = QDir::currentPath() + "/AlgAnalyizeTool/AlgAnalyizeTool.exe";//AlgAnalyizeTool.exeif (!QFile(strProcessPath).exists()){QMessageBox::information(NULL, "提示", "分析进程不存在", QMessageBox::Yes, QMessageBox::Yes);return;}for (int i = 0; i < 4; i++){QJsonObject jsonMain;QJsonObject serverConf;QJsonObject videoAnalyizeConf;videoAnalyizeConf.insert("cpuCores", 4);videoAnalyizeConf.insert("gpuNo", i);videoAnalyizeConf.insert("threadCount", 4);serverConf.insert("ip", "10.25.106.103");serverConf.insert("port", 8011);serverConf.insert("sessionId", QString::number(i));jsonMain.insert("serverConf", serverConf);jsonMain.insert("videoAnalyizeConf", videoAnalyizeConf);QJsonDocument root_Doc;root_Doc.setObject(jsonMain);QByteArray root_str = root_Doc.toJson(QJsonDocument::Compact); //紧凑格式// QByteArray root_str = root_Doc.toJson(QJsonDocument::Indented); //标准JSON格式 QString strJson(root_str);QString strJson((root_str.toBase64()));QStringList Qstringlist;Qstringlist << strJson;QProcess* process=new QProcess(this);connect(process,&QProcess::stateChanged, this, [=](QProcess::ProcessState state) {if (state== QProcess::ProcessState::NotRunning){QMap<int, QProcess*>::iterator it = m_processMap.find(i);if (it != m_processMap.end()){delete it.value();m_processMap.erase(it);}}});LOG_TRACE("start begin! ");process->start(strProcessPath, Qstringlist);m_processMap[i] = process;LOG_TRACE("start end! ");}
Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理的更多相关文章
- 程序启动读取和关闭时保存应用程序设置(QSettings)
保存应用程序设置(QSettings)1. QSettings 类 QSettings 提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等.在 Windo ...
- 运用pool进程池启动大量子进程
# Pool进程池类 from multiprocessing import Pool import os import time import random def run(index): prin ...
- qt 单文档程序关闭时在delete ui处出现segmentation fault
做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...
- Qt窗体关闭时,如何自动销毁窗体类对象
Qt窗体关闭时,如何自动销毁窗体类对象 要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...
- 线程_使用multiprocessing启动一个子进程及创建Process 的子类
from multiprocessing import Process import os # 子进程执行的函数 def run_proc(name): print("子进程运行中,名称:% ...
- qt 启动参数 -qws
运行嵌入式程序 在嵌入式QT版本中,程序需要服务器或自己作为服务器程序. 服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象.或者使用-qws ...
- Oracle数据库体系结构、启动过程、关闭过程
一.Oracle数据库体系结构体系结构由下面组件组成:1.Oracle服务器(Server):由数据库实例和数据库文件组成,另外在用户建立与服务器的连接时启动服务器进程并分配PGA(程序全局区) (1 ...
- C# 程序异常关闭时的捕获
本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以 ...
- pyqt pyside 设置窗口关闭时删除自身
pyqt pyside 设置窗口关闭时删除自身 self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
随机推荐
- Python File truncate() 方法
概述 truncate() 方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符.高佣联盟 www.cgewang.com 如果没有指定 size,则从当前位置起截断:截 ...
- 痞子衡嵌入式:为下一代智能可穿戴设备而生 - i.MXRT500
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT500. 自2018年i.MXRTxxx系列首款芯片i.MXRT600(主打智能语 ...
- samba服务及配置
samba 目录 samba 1. samba简介 2. samba访问 配置示例 3.搭建用户认证共享服务器 4.搭建匿名用户共享服务器 1. samba简介 Samba是在Linux和UNIX系统 ...
- 服务消费者(RestTemplate+Ribbon+feign)
负载均衡 spring cloud 体系中,我们知道服务之间的调用是通过http协议进行调用的.注册中心就是维护这些调用的服务的各个服务列表.在Spring中提供了RestTemplate,用于访 ...
- adb如何连接Mac版腾讯手游助手
Mac版腾讯手游助手,的端口是6555: 所以使用adb connect 127.0.0.1:6555 进行连接
- swift 5.0 创建button方法
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any ...
- 行为驱动模型-Behave
行为驱动开发英文名为Behave Driven Development,简称BDD,是一种敏捷开发方法,主要是从用户的需求出发强调系统行为.将此模型借鉴到自动化测试中称其为行为驱动测试模型,它是一种通 ...
- java_Object类、日期时间类、System类、包装类
Object类 java.lang.Object 类是所有类的父类.它描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类, 那么默认则继承自O ...
- tomcat启动失败的解决办法
初次安装tomcat启动失败的解决办法: 1.CATALINA_HOME C:\Program Files\apache-tomcat-8.5.242.path %CATALINA_HOME% ...
- MySQL数据的增删改查查查查查查查查查查查查查查查查(查是真的多)
一 数据的增加 主要是运用insert into 语句. 格式: insert into 表名称 values(数据,数据,数据)(要按顺序来,有没有数据的可以加null) 只增加某些字段里数据的 ...