当前位置: 首页 > news >正文

QT--进程

一、进程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";  // 锁定共享内存失败时输出调试信息}
}

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

相关文章:

QT--进程

一、进程QProcess QProcess 用于启动和控制外部进程&#xff0c;管理其输入输出流。 使用方法 start()&#xff1a;启动一个新进程。setStandardInputFile()&#xff1a;将文件作为标准输入。将进程的标准输入&#xff08;stdin&#xff09;重定向到指定的文件。换句话说&am…...

凸优化笔记-基本概念

原文 文章目录 最小二乘问题 仿射affine hullaffine dimension 凸集锥集超平面和半空间单纯形整半定锥保凸性的操作透视函数 凸函数的条件1阶判定条件2阶判定条件 Epigraph 外图 m i n i m i z e f 0 ( x ) minimize\ \ \ f_0(x) minimize f0​(x) s u b j e c t t o f i ( …...

1858. 数组查找及替换

问题描述 给定某整数数组和某一整数 b 。 要求删除数组中可以被 b 整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在 &#x1d434;‘ 到 Z 的 ASCII 之间&#xff0c;替换为对应字母。 元素个数不超过 100&#xff0c;&#x1d44f; 在 1 …...

计算机视觉与面部识别:技术、应用与未来发展

引言 在当今数字化时代&#xff0c;计算机视觉技术迅速发展&#xff0c;成为人工智能领域的一个重要分支。计算机视觉旨在让机器理解和解释视觉信息&#xff0c;模拟人类的视觉系统。它在各行各业中发挥着重要作用&#xff0c;从自动驾驶汽车到智能监控系统&#xff0c;再到医疗…...

懒人精灵安卓版纯本地离线文字识别插件

目的 懒人精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。懒人精灵也包含图色功能&#xff0c;识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解下更优秀的…...

在线教育数仓项目(数据采集部分1)

文章目录 数据仓库概念项目需求及架构设计项目需求分析系统数据流程设计框架版本选型集群规模估算集群资源规划设计 数据生成模块目标数据页面事件曝光启动播放错误 数据埋点主流埋点方式&#xff08;了解&#xff09;埋点数据上报时机埋点数据日志结构 服务器和JDK准备服务器准…...

帕金森病(PD)诊断:三种基于语音的深度学习方法

帕金森病&#xff08;Parkinson’s disease, PD&#xff09;是世界上第二大流行的神经退行性疾病&#xff0c;全球影响着超过1000万人&#xff0c;仅次于阿尔茨海默症。人们通常在65岁左右被诊断出患有此病。PD的一些症状包括震颤、肌肉僵硬和运动迟缓。这些症状往往出现在较晚…...

【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示

2024第三届钉钉杯大学生大数据挑战赛今天已经开赛&#xff0c;【A题】思路解析代码&#xff0c;资料预览&#xff1a;...

【优质精选】12节大模型系列教学课程之二:RAG 原理与应用

课程二&#xff1a;RAG 原理与应用 12节大模型系列教学课程之二&#xff1a;RAG 原理与应用 课程详细内容RAG 技术的基础知识RAG 的工作原理RAG 提高生成质量和准确性的原理RAG 在问答系统中的应用RAG 在文本创作中的应用RAG 在其他领域的应用探索RAG 技术的挑战与应对策略RAG …...

vue3前端开发-小兔鲜项目-产品详情基础数据渲染

vue3前端开发-小兔鲜项目-产品详情基础数据渲染&#xff01;这一次内容比较多&#xff0c;我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步&#xff0c;还是老规矩&#xff0c;先准备好接口函数。方便我们的页面组件拿到对…...

Docker入门指南:Linux系统下的完整安装步骤与常见问题解答

本文以centos7演示。 Docker安装 可参考官方安装文档&#xff1a;Install Docker Engine on CentOS | Docker Docs 一图流&#xff1a; # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…...

Netty实现数据上下行

Netty实现数据上下行 使用LVSNGinxNetty实现数据接入 在数据上行的时候&#xff0c;通过使用车辆唯一标识码&#xff08;vin&#xff09;和连接通道绑定 Netty一些配置参数如下: #netty项目使用的端口 server.port8017 #使用启用epoll&#xff08;在Linux上拥有更好的传输性…...

【React】事件绑定:深入解析高效处理用户交互的最佳实践

文章目录 一、什么是事件绑定&#xff1f;二、基本事件绑定三、绑定 this 上下文四、传递参数五、事件对象六、事件委托七、常见事件处理八、优化事件处理 React 是现代前端开发中最受欢迎的框架之一&#xff0c;其组件化和高效的状态管理能力使得构建复杂的用户界面变得更加容…...

SpringCloud:使用OpenFeign优化前面的Nacos实现高效购物车商品信息处理

在现代电商系统中&#xff0c;购物车的性能直接影响用户的购物体验。为了提升系统性能和用户满意度&#xff0c;我们可以使用Spring Cloud的OpenFeign和负载均衡器来高效地处理购物车中的商品信息。本文将详细介绍如何在Spring Cloud中集成这些组件&#xff0c;并实现一个高效的…...

计算机三级嵌入式笔记(二)——嵌入式处理器

目录 考点1 嵌入式处理器的结构类型 考点2 嵌入式处理器简介 考点3 ARM处理器概述 考点4 处理器和处理器核 考点5 ARM 处理器的分类 考点6 经典 ARM 处理器 考点7 ARM Cortex 嵌入式处理器 考点8 ARM Cortex实时嵌入式处理器 考点9 ARM Cortex 应用处理器 考点10 AR…...

【GoLang】Golang 快速入门(第一篇)

目录 1.简介&#xff1a; 2.设计初衷&#xff1a; 3.Go语言的 特点 4.应用领域: 5.用go语言的公司&#xff1a; 6. 开发工具介绍以及环境搭建 1.工具介绍: 2.VSCode的安装: 3.安装过程&#xff1a; 4.Windows下搭建Go开发环境--安装和配置SDK 1.搭建Go开发环境 - 安装…...

Linux中的三类读写函数

文件IO和标准IO的区别 遵循标准&#xff1a; 文件IO遵循POSIX标准&#xff0c;主要在类UNIX环境下使用。标准IO遵循ANSI标准&#xff0c;具有更好的可移植性&#xff0c;可以在不同的操作系统上重新编译后运行。可移植性&#xff1a; 文件IO的可移植性相对较差&#xff0c;因为…...

MATLAB基础应用精讲-【数模应用】二元Probit回归分析

目录 前言 知识储备 二元Logistic模型和Probit模型 Logistic模型的形式 Probit模型 优势比(OR) 准二项分布族 算法原理 数学模型 二元因变量和线性概率模型 probit和logit回归 logit和probit模型的估计和推断 稳健性检验 二元logit回归分析全流程 一、案例数…...

找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)

回溯算法今天这几个题目做过&#xff0c;晚上有面试&#xff0c;今天水一水。 第一题&#xff1a;Leetcode77. 组合 题目描述 解题思路 从题目示例来看&#xff0c;k个数是不能重合的&#xff0c;但是题目没有明确说明这一点。 使用回溯算法解决此问题&#xff0c;利用树形…...

如何有效的进行小程序的优化

如今小程序已经成为了许多开发者开展业务&#xff0c;提供服务的重要平台 。所以如何有效的优化小程序成为了开发者关注的首要问题&#xff0c;以下是一份详细的小程序优化方案&#xff1a; 一、目标设定 明确小程序优化的主要目标&#xff0c;例如提高用户留存率、增加用户活…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...