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 Tuple(元组) min()方法
描述 Python 元组 min() 函数返回元组中元素最小值.高佣联盟 www.cgewang.com 语法 min()方法语法: min(tuple) 参数 tuple -- 指定的元组. 返回值 ...
- CentOS部署RabbitMQ
CentOS版本:CentOS-7-x86_64-DVD-1804 RabbitMQ版本:3.7.24 1. 下载安装包 因为RabbitMQ是erlang语言开发的,所以需要提前安装erlang环境 ...
- Tutte 定理与 Tutte–Berge 公式
Tutte theorem 图 \(G=(V,E)\) 有完美匹配当且仅当满足 \(\forall U\subseteq V,o(G-U)\le|U|,o(X)\) 表示 X 子图的奇连通块数. Tu ...
- 博客主题推荐——复杂&简单
首先感谢原作者cjunn提供的主题autm,以下配置都基于此主题设定.很多小伙伴喜欢现在的样式,分享如下.只需简单几步即可. 如果你想使用本博客主题样式,并希望能得到远程推送更新,只需查看 快速部署. ...
- week4:周测错题
4.如何在类外,给对象动态添加绑定方法 import types def qingtianzhu(obj,name): print("请我叫我一柱擎天,简称{},颜色是{}".fo ...
- 剑指Offer顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- Vue 给子组件绑定v-model
父组件使用子组件时,使用v-model指令,在子组件中使用value获取props的值 父组件 <template> <div style="margin:20px;dis ...
- jQuery之表单校验:新用户注册
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Shiro+SpringBoot认证
该博客以Web为基础 一.引入依赖 shiro-all包含shiro所有的包.shiro-core是核心包.shiro-web是与web整合.shiro-spring是与spring整合.shiro- ...
- WKWebView 网络请求Header 丢失
WKWebView 是苹果手机上主要的H5加载控件,它相比UIWebView 有诸多优势.在次不做比较,但是它的坑缺比较多.网上也有很多的例子但是做的比较好的真不多,我在这里推荐俩博客供大家参考.ht ...