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)
随机推荐
- Entry基本用法
1.BooleanVar() 布尔类型 2.IntVar() 整数类型 3.DoubleVar() 浮点数类型 4.StringVar() 字符串类型 5.self.entry1 = Entry(se ...
- 使用FreeSurfer进行脑区分割
FreeSurfer 是美国哈佛-麻省理工卫生科学与技术部和马萨诸塞州总医院共同开发的一款磁共振数据处理软件包,是基于 Linux 平台的全免费开源软件.FreeSurfer 能完成对高分辨率的 MR ...
- luogu P6097 子集卷积 FST FWT
LINK:子集卷积 学了1h多 终于看懂是怎么回事了(题解写的不太清楚 翻了好几篇博客才懂 一个需要用到的性质 二进制位为1个数是i的二进制数s 任意两个没有子集关系.挺显然. 而FST就是利用这个性 ...
- luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树
LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...
- bzoj 1515 [POI2006]Lis-The Postman 有向图欧拉回路
LINK:Lis-The Postman 看完题觉得 虽然容易发现是有向图欧拉回路 但是觉得很难解决这个问题. 先分析一下有向图的欧拉回路:充要条件 图中每个点的入度-出度=0且整张图是一个强连通分量 ...
- Linux的VMWare14中配置Centos7桥接网络环境(网络一)
1.查看当前初始环境如下:在windows端先查看本机ip ifconfig
- OAuth2.0-3客户端授权放到数据库
授权得客户端信息.授权码信息全都存在数据库 1.建表 官方给了个sql文件:https://github.com/spring-projects/spring-security-oauth/blob/ ...
- 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来
源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...
- Redis服务之Redis5集群相关命令说明
上一篇博客主要聊了下redis.trib.rb这个工具来管理redis3/4 cluster 中的节点,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13456 ...
- Vue 大量data及rules的data选项结构组织
如果Vue文件需要很多的data成员及表单验证,建议使用类似结构 export default{ data(){ const model = { username: 'suzhen', passwor ...