自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

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启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理的更多相关文章

  1. 程序启动读取和关闭时保存应用程序设置(QSettings)

    保存应用程序设置(QSettings)1. QSettings 类 QSettings 提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等.在 Windo ...

  2. 运用pool进程池启动大量子进程

    # Pool进程池类 from multiprocessing import Pool import os import time import random def run(index): prin ...

  3. qt 单文档程序关闭时在delete ui处出现segmentation fault

    做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...

  4. Qt窗体关闭时,如何自动销毁窗体类对象

    Qt窗体关闭时,如何自动销毁窗体类对象     要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...

  5. 线程_使用multiprocessing启动一个子进程及创建Process 的子类

    from multiprocessing import Process import os # 子进程执行的函数 def run_proc(name): print("子进程运行中,名称:% ...

  6. qt 启动参数 -qws

    运行嵌入式程序 在嵌入式QT版本中,程序需要服务器或自己作为服务器程序. 服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象.或者使用-qws ...

  7. Oracle数据库体系结构、启动过程、关闭过程

    一.Oracle数据库体系结构体系结构由下面组件组成:1.Oracle服务器(Server):由数据库实例和数据库文件组成,另外在用户建立与服务器的连接时启动服务器进程并分配PGA(程序全局区) (1 ...

  8. C# 程序异常关闭时的捕获

    本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以 ...

  9. pyqt pyside 设置窗口关闭时删除自身

    pyqt pyside 设置窗口关闭时删除自身 self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

随机推荐

  1. Python File truncate() 方法

    概述 truncate() 方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符.高佣联盟 www.cgewang.com 如果没有指定 size,则从当前位置起截断:截 ...

  2. 痞子衡嵌入式:为下一代智能可穿戴设备而生 - i.MXRT500

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT500. 自2018年i.MXRTxxx系列首款芯片i.MXRT600(主打智能语 ...

  3. samba服务及配置

    samba 目录 samba 1. samba简介 2. samba访问 配置示例 3.搭建用户认证共享服务器 4.搭建匿名用户共享服务器 1. samba简介 Samba是在Linux和UNIX系统 ...

  4. 服务消费者(RestTemplate+Ribbon+feign)

    负载均衡 ​ spring cloud 体系中,我们知道服务之间的调用是通过http协议进行调用的.注册中心就是维护这些调用的服务的各个服务列表.在Spring中提供了RestTemplate,用于访 ...

  5. adb如何连接Mac版腾讯手游助手

    Mac版腾讯手游助手,的端口是6555: 所以使用adb connect 127.0.0.1:6555 进行连接

  6. swift 5.0 创建button方法

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any ...

  7. 行为驱动模型-Behave

    行为驱动开发英文名为Behave Driven Development,简称BDD,是一种敏捷开发方法,主要是从用户的需求出发强调系统行为.将此模型借鉴到自动化测试中称其为行为驱动测试模型,它是一种通 ...

  8. java_Object类、日期时间类、System类、包装类

    Object类 java.lang.Object 类是所有类的父类.它描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类, 那么默认则继承自O ...

  9. tomcat启动失败的解决办法

    初次安装tomcat启动失败的解决办法: 1.CATALINA_HOME    C:\Program Files\apache-tomcat-8.5.242.path  %CATALINA_HOME% ...

  10. MySQL数据的增删改查查查查查查查查查查查查查查查查(查是真的多)

    一 数据的增加 主要是运用insert  into 语句. 格式: insert  into 表名称 values(数据,数据,数据)(要按顺序来,有没有数据的可以加null) 只增加某些字段里数据的 ...