QT--进程

news2024/9/20 14:37:12

一、进程QProcess

QProcess 用于启动和控制外部进程,管理其输入输出流。

  1. 使用方法
  • start():启动一个新进程。
  • setStandardInputFile():将文件作为标准输入。将进程的标准输入(stdin)重定向到指定的文件。换句话说,进程会从这个文件中读取输入数据,而不是从命令行或其他输入源读取。
  • setStandardOutputFile():将文件作为标准输出。也就是说,进程的所有输出数据(正常输出)将被写入这个文件,而不是显示在控制台或其他标准输出流。
  • readAllStandardOutput():读取所有标准输出数据。
  • terminate():终止进程。
  • kill():杀死进程。
  • waitForStarted():等待进程启动完成。
  • write():向进程的标准输入写数据。
  • waitForFinished():等待进程结束。
  • state():获取进程的当前状态。
  1. 信号
  • started()
    当使用QProcess::start()成功启动进程(连锁触发)时,QProcess对象会发射started()信号。这意味着被启动的进程已经成功运行。
  • finished()
    当进程(触发的进程)完成并退出时发射。可用于处理进程完成后的清理工作。
  • stateChanged()
    当进程状态发生变化时,会触发这个信号。通过newState可以知道进程当前的状态。
    QProcess::NotRunning:进程未运行。
    QProcess::Starting:进程正在启动。
    QProcess::Running:进程正在运行。
  • readyReadStandardOutput()
    readyReadStandardOutput() 是 QProcess 类的一个信号,当外部进程的标准输出有数据可读时发射。可以使用这个信号来读取外部进程的输出数据。

QSharedMemory 用于在进程间共享数据,创建和管理共享内存。

  1. 包含头文件QSharedMemory
  2. 创建QSharedMemory对象。并指定共享内存的名字。共享内存的名称是一个唯一标识符,确保不同进程能够正确地访问相同的共享内存区域。
QSharedMemory sharedMemory("MySharedMemory");
等价于
QSharedMemory sharedMemory;
sharedMemory->setKey("MySharedMemory");

  1. 创建共享内存
if (!sharedMemory->create(1024)) { // 创建1024字节的共享内存
    qDebug() << "Failed to create shared memory";
}

  1. 链接到共享内存:在另一个进程中,尝试连接到已存在的共享内存区域
pShareM = new QSharedMemory;
pShareM->setKey("MySharedMemory");//设置同一个共享内存区域
if (!pShareM->attach()) {// 连接到共享内存
    qDebug() << "Failed to attach to shared memory";
}

  1. 锁定共享内存以读写数据
//写入数据
if (sharedMemory.lock()) {
    char *to = static_cast<char *>(sharedMemory.data());
    strcpy(to, "Hello from Qt!");//关键代码
    sharedMemory.unlock();
} else {
    qDebug() << "Failed to lock shared memory for writing";
}
//读取数据
if (sharedMemory.lock()) {
    char *from = static_cast<char *>(sharedMemory.data());
    qDebug() << "Data from shared memory:" << from;//关键代码
    sharedMemory.unlock();
} else {
    qDebug() << "Failed to lock shared memory for reading";
}

  1. 解除链接和删除共享内存
sharedMemory.detach();
sharedMemory.destroy();

代码示例

//主进程
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QProcess>
#include <QSharedMemory>
#include <QFile>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化 QProcess 对象,并连接信号到槽
    pSubP = new QProcess(this);
    connect(pSubP, SIGNAL(started()), this, SLOT(pSubStartedSlotFun()));  // 当子进程启动时
    connect(pSubP, SIGNAL(finished(int)), this, SLOT(pSubPFinishedSlotFun(int)));  // 当子进程完成时
    connect(pSubP, SIGNAL(readyReadStandardOutput()), this, SLOT(readSubPOutput()));  // 子进程有标准输出数据时

    // 启动子进程,并指定子进程的执行程序路径
    pSubP->start("/mnt/hgfs/linux_learn/qt_file/process/sub/build-project7_24_vice_process-Desktop_Qt_5_12_9_GCC_64bit-Debug/project7_24_vice_process");

    // 设置子进程的标准输入和标准输出文件
    pSubP->setStandardInputFile("/path/to/input.txt");  // 设置标准输入来源为指定文件
    pSubP->setStandardOutputFile("/path/to/output.txt");  // 设置标准输出目的地为指定文件

    // 初始化共享内存
    pShareM = new QSharedMemory(this);
    pShareM->setKey("zhhhhhhhhhhhhhhz");  // 设置共享内存的唯一标识符

    // 创建共享内存,大小为128字节
    if (!pShareM->create(128)) {
        qDebug() << "Failed to create shared memory";  // 创建失败时输出调试信息
    } else {
        qDebug() << "Shared memory created";  // 创建成功时输出调试信息
    }

    // 连接按钮点击信号到槽函数
    connect(ui->btnWrite, SIGNAL(clicked()), this, SLOT(btnWriteClickedSlotFun()));  // 当点击写入按钮时
    connect(ui->btnRead, SIGNAL(clicked()), this, SLOT(btnReadClickedSlotFun()));  // 当点击读取按钮时
    connect(ui->btnTerminate, SIGNAL(clicked()), this, SLOT(btnTerminateClickedSlotFun()));  // 当点击终止按钮时
    connect(ui->btnKill, SIGNAL(clicked()), this, SLOT(btnKillClickedSlotFun()));  // 当点击杀死按钮时
}

Widget::~Widget()
{
    delete ui;
    // 解除共享内存的连接
    if (pShareM->isAttached()) {
        pShareM->detach();
    }
}

void Widget::pSubStartedSlotFun()
{
    qDebug() << "Sub process started";  // 子进程启动时输出调试信息
}

void Widget::pSubPFinishedSlotFun(int exitCode)
{
    qDebug() << "Sub process finished with exit code:" << exitCode;  // 子进程结束时输出调试信息,包含退出码
}

void Widget::readSubPOutput()
{
    // 读取子进程的标准输出
    QByteArray output = pSubP->readAllStandardOutput();
    qDebug() << "Output from sub process:" << output;  // 输出子进程的标准输出数据
}

void Widget::btnWriteClickedSlotFun()
{
    // 获取文本框中的文本
    QString str = ui->textEdit->toPlainText();
    std::string sstr = str.toStdString();
    const char *p = sstr.c_str();

    // 写入数据到共享内存
    if (pShareM->lock()) {  // 锁定共享内存以确保数据安全写入
        memcpy(pShareM->data(), p, sstr.length());  // 复制数据到共享内存
        pShareM->unlock();  // 解锁共享内存
        qDebug() << "Data written to shared memory";  // 输出写入数据成功的调试信息
    } else {
        qDebug() << "Failed to lock shared memory for writing";  // 锁定共享内存失败时输出调试信息
    }
}

void Widget::btnReadClickedSlotFun()
{
    // 从共享内存中读取数据
    if (pShareM->lock()) {  // 锁定共享内存以确保数据安全读取
        char *from = static_cast<char *>(pShareM->data());  // 获取共享内存的数据指针
        ui->textEdit->setText(from);  // 将读取到的数据设置到文本框中
        pShareM->unlock();  // 解锁共享内存
        qDebug() << "Data read from shared memory";  // 输出读取数据成功的调试信息
    } else {
        qDebug() << "Failed to lock shared memory for reading";  // 锁定共享内存失败时输出调试信息
    }
}

void Widget::btnTerminateClickedSlotFun()
{
    pSubP->terminate();  // 请求子进程正常终止
    pSubP->waitForFinished();  // 等待子进程终止
    qDebug() << "Sub process terminated";  // 输出子进程终止的调试信息
}

void Widget::btnKillClickedSlotFun()
{
    pSubP->kill();  // 强制杀死子进程
    pSubP->waitForFinished();  // 等待子进程结束
    qDebug() << "Sub process killed";  // 输出子进程被杀死的调试信息
}
//被启动进程的代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QSharedMemory>
#include <QFile>
#include <QTextStream>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化共享内存
    pShareM = new QSharedMemory(this);
    pShareM->setKey("zhhhhhhhhhhhhhhz");  // 设置共享内存的唯一标识符

    // 尝试连接到共享内存
    if (!pShareM->attach()) {  // 连接到已经存在的共享内存
        qDebug() << "Failed to attach to shared memory";  // 连接失败时输出调试信息
    } else {
        qDebug() << "Attached to shared memory";  // 连接成功时输出调试信息
    }

    // 连接按钮点击信号到槽函数
    connect(ui->btnRead, SIGNAL(clicked()), this, SLOT(btnReadClickedSlotFun()));  // 当点击读取按钮时
    connect(ui->btnWrite, SIGNAL(clicked()), this, SLOT(btnWriteClickedSlotFun()));  // 当点击写入按钮时
}

Widget::~Widget()
{
    delete ui;
    // 解除共享内存的连接
    if (pShareM->isAttached()) {
        pShareM->detach();
    }
}

void Widget::btnReadClickedSlotFun()
{
    // 从共享内存中读取数据
    if (pShareM->lock()) {  // 锁定共享内存以确保数据安全读取
        char *from = static_cast<char *>(pShareM->data());  // 获取共享内存的数据指针
        ui->textEdit->setText(from);  // 将读取到的数据设置到文本框中
        pShareM->unlock();  // 解锁共享内存
        qDebug() << "Data read from shared memory";  // 输出读取数据成功的调试信息
    } else {
        qDebug() << "Failed to lock shared memory for reading";  // 锁定共享内存失败时输出调试信息
    }
}

void Widget::btnWriteClickedSlotFun()
{
    // 获取文本框中的文本
    QString str = ui->textEdit->toPlainText();
    std::string sstr = str.toStdString();
    const char *p = sstr.c_str();

    // 写入数据到共享内存
    if (pShareM->lock()) {  // 锁定共享内存以确保数据安全写入
        memcpy(pShareM->data(), p, sstr.length());  // 复制数据到共享内存
        pShareM->unlock();  // 解锁共享内存
        qDebug() << "Data written to shared memory";  // 输出写入数据成功的调试信息
    } else {
        qDebug() << "Failed to lock shared memory for writing";  // 锁定共享内存失败时输出调试信息
    }
}

代码存放路径
在这里插入图片描述
运行
在这里插入图片描述

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

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

相关文章

【Linux】从零开始认识多线程 --- 线程互斥

人生有许多事情 正如船后的波纹 总要过后才觉得美的 -- 余光中 线程互斥 1 线程类的封装1.1 框架搭建1.2 线程启动1.3 线程终止1.4 线程等待1.5 运行测试 2 线程互斥2.1 多线程访问的问题2.2 解决办法 --- 锁2.3 从原理角度理解锁 Thanks♪(&#xff65;ω&#xff65;)&am…

QT信号和信号槽

信号和信号槽 一.信号与槽1.信号和槽的概述1.2.信号的本质1.3.信号的本质 二.信号和槽的使用2.1 连接信号和槽connect()函数原型&#xff1a;参数的说明 三.自定义信号和槽3.1基本语法1.自定义信号槽的书写规范2、自定义槽函数书写规范3.发送信号 3.2带参数的信号和槽 四.信号与…

Eclipse 搭建 C/C++ 开发环境以及eclipse的使用

一、下载、安装 MinGW 1、下载: 下载地址&#xff1a;MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 下载完成后&#xff0c;得到一个名为 mingw-get-setup.exe 的安装文件。双击运行&#xff0c;安装即可。 …

一套功能齐全、二开友好的即时通讯IM工具,提供能力库和UI库,支持单聊、频道和机器人(附源码)

前言 在当今数字化时代&#xff0c;即时通讯(IM)和实时音视频(RTC)功能已成为众多应用的标配。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如架构落后、成本高昂、数据安全性和隐私保护不足&#xff0c;以及二次开发和部署的复杂性。 为了解决这些问题&…

超薄超小单独北斗定位的4G工牌记录仪、4G胸卡记录仪

AIoT万物智联&#xff0c;智能安全帽生产厂家&#xff0c;执法记录仪生产厂家&#xff0c;智能安全帽、智能头盔、头盔记录仪、执法记录仪、智能视频分析/边缘计算AI盒子、车载DVR/NVR、布控球、智能眼镜、智能手电、智能电子工牌、无人机4G补传系统等统一接入大型融合通信可视…

无法继续安装 计算机正忙于安装一个非 Visual Studio 的程序。

解决办法 以管理员身份打开cmd运行窗口&#xff0c;执行以下命令&#xff1a; taskkill -f -im msiexec*

网络三剑客之sed

目录 一、sed是什么 二、sed为什么这样工作&#xff08;原理&#xff09; 三、sed命令该怎么操作 3.1 基本的操作选项 3.2 怎么去使用sed 3.3 操作实例 3.3.1 打印输出&#xff08;-n、-p、-r&#xff09; 3.3.2 增加内容&#xff08;i、a&#xff09; 3.3.3 删除&…

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路&#xff0c;三分钟的热情可以放弃往下看了。2.多练多想&#xff0c;不要离开了教程什么都不会了&#xff0c;最好看完教程自己独立完成技术方面的开发。3.有时多百度&#xff0c;我们往往都遇不到好心的大神&#xff0c;谁会无聊天天给…

机器学习 | 回归算法原理——最速下降法(梯度下降法)

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最小二乘法继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享最速下降法&#xff08;梯度下降法&#xff09;这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…

大文件分片上传(前端TS实现)

大文件分片上传 内容 一般情况下&#xff0c;前端上传文件就是new FormData,然后把文件 append 进去&#xff0c;然后post发送给后端就完事了&#xff0c;但是文件越大&#xff0c;上传的文件也就越长&#xff0c;如果在上传过程中&#xff0c;突然网络故障&#xff0c;又或者…

opencascade AIS_InteractiveContext源码学习9 obsolete methods

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

鸿蒙SDK开发能力

什么是鸿蒙SDK&#xff1a;HarmonyOS(Software Development Kit)是面向应用和服务开发的开放能力合集,本质就是工具集&#xff0c;与JDK、AndroidSDK在逻辑上有相似之处 18N&#xff1a;1指的是手机&#xff0c;8指的是车机、音箱、耳机、手表/手环、平板、大屏、PC、AR/VR&am…

Python——使用Seaborn钻石数据可视化分析(2)

续 Python——使用Seaborn钻石数据可视化分析(1) 目录 📈 4、非数值变量描述性统计分析 1️⃣ 柱状图——分析钻石切工的情况 📍 sns.countplot —— 绘制柱状图、条形图 2️⃣ 箱线图——分析不同切工的钻石的价格情况 📍 sns.barplot —— 不同分类变量之间的数…

用这些宝藏AI工具打造副业!实现被动收入!

前言 大家好&#xff0c;我是月月&#xff01;今天我们来梳理一下在目前的形势下&#xff0c;如何用AI工具打造一个躺赚的副业&#xff0c;实现被动收入&#xff1f;有哪些方法和途径&#xff1f;在本篇文章我主要提供一些已有的AI工具&#xff0c;后面我们再根据具体的AI工具…

国家自然灾害防治研究院专家莅临国信华源公司指导调研

7月16日&#xff0c;应急管理部国家自然灾害防治研究院党委书记杨思全与中关村科技园区丰台园管理委员会副主任王成玉一行莅临北京国信华源公司进行调研指导。我司总经办及相关部门负责人陪同座谈&#xff0c;并详细汇报了企业的运营情况和技术成果。 在我司高层的陪同下&#…

数字孪生:变电站监测和运维的智能化实践

随着夏季高温天气的到来&#xff0c;我国用电也迎来了高峰。用电负荷持续走高&#xff0c;对全国各地电网运维也迎来了挑战。电力系统作为现代社会的基础设施&#xff0c;其稳定性和可靠性至关重要&#xff0c;变电站则是实现电力系统电力互联互通的枢纽。 在传统变电站中&…

VLC输出NDI媒体流

目录 1. 下载安装VLC Play 2. 首先在电脑上安装NDI Tools 3. 运行VLC进行输出配置 4. 播放视频 5. 验证 (1)用Studio Monitor验证 (2)用OBS验证 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量…

新书速览|PyTorch深度学习与计算机视觉实践

《PyTorch深度学习与计算机视觉实践》 本书内容 在人工智能的浩瀚星空中&#xff0c;深度学习犹如一颗耀眼的明星&#xff0c;引领着计算机视觉技术的发展。《PyTorch深度学习与计算机视觉实践》带领读者领略深度学习在计算视觉领域的魅力&#xff0c;详解使用PyTorch 2.0进行…

Spring Bean配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

【Python】成功解决conda创建虚拟环境时出现的CondaHTTPError: HTTP 000 CONNECTION FAILED错误

【Python】成功解决conda创建虚拟环境时出现的CondaHTTPError: HTTP 000 CONNECTION FAILED错误 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&a…