qt QProcess学习

QProcess简介

QProcess可以用于启动外部程序,它提供了一系列函数来启动、控制和与外部进程进行交互。

作用:

  1. 启动外部进程: 通过start函数
  2. 进程状态和控制:判断进程是否正在运行、等待进程完成、终止进程等。如stateChanged信号
  3. 进程通信:  支持与外部进程进行通信。可以通过管道(标准输入、标准输出和标准错误输出)进行输入和输出操作。readyReadStandardOutput信号
  4. 信号和槽机制:QProcess使用信号和槽机制来处理与外部进程相关的事件。例如,当外部进程完成时,可以使用finished信号来通知应用程序。

进程id:

qint64 processId() const;

启动进程
一体式:

子进程的方式启动外部程序,外部进程与主程序互不干扰,但外部进程的父进程就是主程序

当主程序退出时,被主程序调用起来的进程也退出。

void start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

void start(QIODevice::OpenMode mode = ReadWrite)

program:启动外部应用程序的路径。不包含空格,包含空格需要在arguments中传入

arguments:传入待启动外部程序的参数,即:int main(int argc, char *argv[])这里的参数。

如果在启动前已经用 setProgram() 和 setArguments() 指定了程序和参数,那么直接调用第二种 start() 函数即可启动;如果没有指定,那么调用第一种 start() 时需要将程序和参数传入参数列表中。

分离式:

以分离的方式启动外部程序,外部程序与主程序互不干扰,外部进程的父进程是系统的 init 进程。

外部程序启动程序后,主程序退出时,被调用的进程继续执行,不退出。    

static bool startDetached(const QString &program, const QStringList &arguments,

const QString &workingDirectory = QString() , qint64 *pid = nullptr);

调⽤start()函数或open()函数启动进程。在程序启动后,QProcess进⼊运⾏状态并发出started()信号

//启动完毕

connect(process, &QProcess::started, this, [=]()

{

qDebug() << "started:" ;

});

execute():

以阻塞的方式启动外部程序,只有外部程序执行完成后,主程序才会继续执行。外部程序的标准输出、标准错误都是重定向到主程序的标准输出和标准错误的。

退出进程

void kill()

void terminate()

kill(),作用是杀死当前进程使之退出。这个函数也是调用平台相关的 API,如在 Windows 上调用 TerminateProcess,而在 Unix 和 macOS 上是将 SIGKILL 信号发送到进程中。

terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。在 Windows 上是发送 WM_CLOSE 到进程的顶级窗口,然后发到进程本身的主线程,而 在 Unix 和 macOS 上是发送 SIGTERM 信号。注意在 Windows 上,没有事件循环或者不处理 WM_CLOSE 消息的控制台程序只能调用 kill() 来终止。

当进程退出时,QProcess重新进⼊NotRunning状态(初始状态),并发出finish()信号。

connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus)

{

if (exitStatus == QProcess::NormalExit) {

qDebug() << "Process finished with exit code:" << exitCode;

}

else {

qDebug() << "Process crashed!";

}

});

同步进程

waitForStarted()函数——阻塞直到进程开始。

waitForReadyRead()函数——阻塞直到有新数据可在当前读取通道上读取为⽌。

waitForBytesWritten()函数——阻塞直到将⼀个有效载荷数据写⼊该进程为⽌。

waitForFinished()函数——阻塞直到过程完成。

通道通信

进程具有两个预定义的输出通道:

标准输出通道(stdout)提供常规控制台输出。

标准错误通道(stderr)通常提供由进程打印的错误。

进程的输出通道与QProcess的读取通道相对应,⽽进程的输⼊通道与QProcess的写⼊通道相对应。这是因为我们使⽤QProcess读取的内容是进程的输出,⽽我们编写的内容则成为进程的输⼊。

当有新的标准输出数据可⽤时,它也会发出readyReadStandardOutput()信号,⽽当有新的标准错误数据可⽤时,它会发出readyReadStandardError()信号。

connect(process, &QProcess::readyReadStandardOutput, this, [=]()

{

QString qstr(process->readAllStandardOutput());

qDebug() << "readyReadStandardOutput:" << qstr;

});

    QByteArray readAllStandardOutput();   //标准输出通道信息

    QByteArray readAllStandardError();  //标准错误通道信息

延伸:如在windows系统上使用QProcess类来判断特定进程是否正在运行

bool isProcessRunning(const QString& processName)

{

    QProcess process;

    process.start("tasklist", QStringList() << "/FI" << "IMAGENAME eq " + processName);

    process.waitForFinished();

    QString output = process.readAllStandardOutput();

    QStringList processes = output.split("\n");

    processes.removeFirst();  // 移除第一行标题

    foreach(QString line, processes) {

        if (line.contains(processName))

            return true;

    }

    return false;

}

延伸:获取环境变量

#include <QCoreApplication>

#include <QProcessEnvironment>

#include <QString>

#include <QDebug>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();

    // 获取环境变量"PATH"的值

    QString path = env.value("PATH");

    qDebug() << "PATH:" << path;

    return a.exec();

}

进程的状态

    enum ProcessState {

        NotRunning,

        Starting,

        Running

};

获取进程的状态:

QProcess::ProcessState state() const;

进程状态改变的信号

进程状态改变,会发出该信号

void stateChanged(QProcess::ProcessState state, QPrivateSignal);

connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state)

{

qDebug() << "show state:";

switch (state)

{

case QProcess::NotRunning:

qDebug() << "Not Running";

break;

case QProcess::Starting:

qDebug() << "Starting";

break;

case QProcess::Running:

qDebug() << "Running";

break;

default:

qDebug() << "otherState";

break;

}

});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Camtasia Studio 2024:视频编辑与制作的新里程碑及需要下载吗

Camtasia Studio 2024&#xff1a;视频编辑与制作的新里程碑 在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐和学习的主要方式之一。为了满足这一需求&#xff0c;视频编辑和制作软件也在不断发展和创新。Camtasia Studio 2024作为一款功能强大的视频编辑软件&#…

GIS+Python:地质灾害风险评价的智能化解决方案

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

3-Flume之拦截器与GangLia监控

Flume Interceptor 概述 Interceptor(拦截器)本身是Source的子组件之一&#xff0c;可以对数据进行拦截、过滤、替换等操作不同于Selector&#xff0c;一个Source上可以配置多个Interceptor&#xff0c;构成拦截器链。需要注意的是&#xff0c;后一个拦截器不能和前一个拦截…

linux docker镜像初始化

linux docker镜像初始化 简介 有的镜像内部使用的linux系统特别精简&#xff0c;许多常用命令无法安装&#xff0c;导致排查问题较为困难。 可以使用cat /etc/os-release查看容器使用的linux版本&#xff0c;再进行一些常用操作的初始化。 Debian # 设置镜像源 RUN rm -f /e…

芒果YOLOv8改进130:Neck篇,即插即用,CCFM重构跨尺度特征融合模块,构建CCFM模块,助力小目标检测涨点

芒果专栏 基于 CCFM 的改进结构,改进源码教程 | 详情如下🥇 💡本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件 YOLOv8改进专栏完整目录链接:👉 芒果YOLOv8深度改进教程 | 🔥 订阅一个…

HarmonyOS 健康系统联系案例 创建项目

上文 HarmonyOS 健康系统联系案例 整体原型图介绍 我们 介绍了健康系统的整体 UI 然后 我们一点一点来 今天先搭个环境 首先 我们打开开发工具首页 创建项目 一个非常令人怀念的步骤啊 我们点击 Create Project 创建一个新的工程 模板 还是选最基础的 Empty Ability 然后 …

Docker系列

目录 练习&#xff1a;去DockerHub搜索并拉取一个Redis镜像 docker下载nacos 练习&#xff1a;去DockerHub搜索并拉取一个Redis镜像 目标&#xff1a; 1&#xff09;去DockerHub搜索Redis镜像 2&#xff09;查看Redis镜像的名称和版本 3&#xff09;利用docker pull命令…

【解决多线程造成的僵尸进程】

shell中强制终止与指定命令匹配的进程&#xff0c;解决多线程造成的僵尸进程非常好用 kill -9 $(pgrep -f command)pgrep -f command’会查找包含指定命令关键词的进程&#xff0c;并返回这些进程的PID&#xff08;进程ID&#xff09;&#xff0c;然后kill -9会使用这些PID来强…

Java异常知识点详解

目录 1. 异常的概念与体系结构 1.1 异常的概念 1. 算术异常 2. 数组越界异常 3. 空指针异常 1.2 异常的体系结构 1.3 异常的分类 2. 异常的处理 2.1 防御式编程 2.2 异常的抛出 2.3 异常声明throws 2.4 try-catch捕获并处理 2.5 finally 2.4 异常的处理流程 3. 自…

Linux基本指令解析二

Linux基本指令解析二 常见指令1.date指令2.find指令3.grep指令4.zip/unzip指令5.tar指令6.bc指令7.uname –r指令 重要的几个热键关机 常见指令 1.date指令 date 指定格式显示时间&#xff1a; date %Y:%m:%d date 用法&#xff1a;date [OPTION]... [FORMAT] 1.在显示方面…

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

PostgreSQL数据库中表的物理大小, 妙懂

数据库中表的物理大小 这是一个很有意思的话题。尤其是在我们做物理设计和空间大小评估的时候。 PostgreSQL中对于稍长一点的列&#xff0c;直接使用了TOAST表来存储&#xff0c;默认是会对表中的数据进行压缩的。关于TOAST, 以后或有时间专门做简单介绍。 先看看相关函数的定…

javaWeb学生宿舍管理系统

一、摘要 本博客介绍了如何使用Spring Boot和MySQL构建一个功能完善的JavaWeb学生宿舍管理系统。该系统分为三个角色&#xff1a;管理员、宿管和学生。管理员拥有对整个系统的全面管理权限&#xff0c;包括学生管理、宿舍管理、入住管理和管理员管理&#xff1b;宿管负责宿舍的…

3.Python数据分析—数据分析入门知识图谱索引(知识体系中篇)

3.Python数据分析—数据分析入门知识图谱&索引-知识体系中篇 一个人简介二数据获取和处理2.1 数据来源&#xff1a;2.2 数据清洗&#xff1a;2.2.1 缺失值处理&#xff1a;2.2.2 异常值处理&#xff1a; 2.3 数据转换&#xff1a;2.3.1 数据类型转换&#xff1a;2.3.2 数据…

【Java程序设计】【C00360】基于Springboot的考研互助交流平台(有论文)

基于Springboot的考研互助交流平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

java常用应用程序编程接口(API)——IO流概述及字节流的使用

前言&#xff1a; IO流和File是用于把数据存放在硬盘里的工具。File可以把文件存至硬盘&#xff0c;但不能更改里面的数据。通过IO流可以改写硬盘里的数据。整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! IO流 I指Input&#xff0c;称为输入流&#xff1a;负责把…

智慧医疗包括哪些方面?智慧医疗发展前景如何?

近年来&#xff0c;随着云计算、物联网&#xff08;internet of things&#xff0c;IOT&#xff09;、移动互联网、大数据、人工智能&#xff08;artificial intelligence&#xff0c;AI&#xff09;、5G网络、区块链等新一代信息技术的逐步成熟和广泛应用&#xff0c;信息化已…

【码云Git提交】Windows

一、第一次提交 1.登录码云创仓库 2.观察创建后的提示&#xff0c;就有步骤命令了 3.我们在系统中打开一个测试文件夹窗口打开GitBash PS&#xff1a;&#xff08;你需要提前装一个Node&#xff0c;本章不介绍&#xff09; 我们打开一个创建的test测试文件夹窗口&#xff0c;…

题目 2808: 买房子

题目描述: 某程序员开始工作&#xff0c;年薪N万&#xff0c;他希望在中关村公馆买一套60平米的房子&#xff0c;现在价格是200万&#xff0c;假设房子价格以每年百分之K增长&#xff0c;并且该程序员未来年薪不变&#xff0c;且不吃不喝&#xff0c;不用交税&#xff0c;每年…

蓝桥杯真题训练 包子凑数(数论)

题解 找到所有数的最大公约数&#xff0c;如果这个数大于1&#xff0c;则说明一定会有数是凑不出来的&#xff0c;即INF&#xff0c;否则的话&#xff0c;用dp去寻找每个数是否能被凑出来&#xff0c;若j-a[i]可以被凑出来&#xff0c;则j一定可以被凑出来&#xff0c;状态转移…