QT--进程
一、进程QProcess
QProcess 用于启动和控制外部进程,管理其输入输出流。
- 使用方法
- start():启动一个新进程。
- setStandardInputFile():将文件作为标准输入。将进程的标准输入(stdin)重定向到指定的文件。换句话说,进程会从这个文件中读取输入数据,而不是从命令行或其他输入源读取。
- setStandardOutputFile():将文件作为标准输出。也就是说,进程的所有输出数据(正常输出)将被写入这个文件,而不是显示在控制台或其他标准输出流。
- readAllStandardOutput():读取所有标准输出数据。
- terminate():终止进程。
- kill():杀死进程。
- waitForStarted():等待进程启动完成。
- write():向进程的标准输入写数据。
- waitForFinished():等待进程结束。
- state():获取进程的当前状态。
- 信号
- started()
当使用QProcess::start()成功启动进程(连锁触发)时,QProcess对象会发射started()信号。这意味着被启动的进程已经成功运行。 - finished()
当进程(触发的进程)完成并退出时发射。可用于处理进程完成后的清理工作。 - stateChanged()
当进程状态发生变化时,会触发这个信号。通过newState可以知道进程当前的状态。
QProcess::NotRunning:进程未运行。
QProcess::Starting:进程正在启动。
QProcess::Running:进程正在运行。 - readyReadStandardOutput()
readyReadStandardOutput() 是 QProcess 类的一个信号,当外部进程的标准输出有数据可读时发射。可以使用这个信号来读取外部进程的输出数据。
QSharedMemory 用于在进程间共享数据,创建和管理共享内存。
- 包含头文件QSharedMemory
- 创建QSharedMemory对象。并指定共享内存的名字。共享内存的名称是一个唯一标识符,确保不同进程能够正确地访问相同的共享内存区域。
QSharedMemory sharedMemory("MySharedMemory");
等价于
QSharedMemory sharedMemory;
sharedMemory->setKey("MySharedMemory");
- 创建共享内存
if (!sharedMemory->create(1024)) { // 创建1024字节的共享内存qDebug() << "Failed to create shared memory";
}
- 链接到共享内存:在另一个进程中,尝试连接到已存在的共享内存区域
pShareM = new QSharedMemory;
pShareM->setKey("MySharedMemory");//设置同一个共享内存区域
if (!pShareM->attach()) {// 连接到共享内存qDebug() << "Failed to attach to shared memory";
}
- 锁定共享内存以读写数据
//写入数据
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";
}
- 解除链接和删除共享内存
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 用于启动和控制外部进程,管理其输入输出流。 使用方法 start():启动一个新进程。setStandardInputFile():将文件作为标准输入。将进程的标准输入(stdin)重定向到指定的文件。换句话说&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 整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在 𝐴‘ 到 Z 的 ASCII 之间,替换为对应字母。 元素个数不超过 100,𝑏 在 1 …...
计算机视觉与面部识别:技术、应用与未来发展
引言 在当今数字化时代,计算机视觉技术迅速发展,成为人工智能领域的一个重要分支。计算机视觉旨在让机器理解和解释视觉信息,模拟人类的视觉系统。它在各行各业中发挥着重要作用,从自动驾驶汽车到智能监控系统,再到医疗…...
懒人精灵安卓版纯本地离线文字识别插件
目的 懒人精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务,节省大量人工操作的时间。懒人精灵也包含图色功能,识别屏幕上的图像,根据图像的变化自动执行相应的操作。本篇文章主要讲解下更优秀的…...
在线教育数仓项目(数据采集部分1)
文章目录 数据仓库概念项目需求及架构设计项目需求分析系统数据流程设计框架版本选型集群规模估算集群资源规划设计 数据生成模块目标数据页面事件曝光启动播放错误 数据埋点主流埋点方式(了解)埋点数据上报时机埋点数据日志结构 服务器和JDK准备服务器准…...
帕金森病(PD)诊断:三种基于语音的深度学习方法
帕金森病(Parkinson’s disease, PD)是世界上第二大流行的神经退行性疾病,全球影响着超过1000万人,仅次于阿尔茨海默症。人们通常在65岁左右被诊断出患有此病。PD的一些症状包括震颤、肌肉僵硬和运动迟缓。这些症状往往出现在较晚…...
【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示
2024第三届钉钉杯大学生大数据挑战赛今天已经开赛,【A题】思路解析代码,资料预览:...
【优质精选】12节大模型系列教学课程之二:RAG 原理与应用
课程二:RAG 原理与应用 12节大模型系列教学课程之二:RAG 原理与应用 课程详细内容RAG 技术的基础知识RAG 的工作原理RAG 提高生成质量和准确性的原理RAG 在问答系统中的应用RAG 在文本创作中的应用RAG 在其他领域的应用探索RAG 技术的挑战与应对策略RAG …...
vue3前端开发-小兔鲜项目-产品详情基础数据渲染
vue3前端开发-小兔鲜项目-产品详情基础数据渲染!这一次内容比较多,我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步,还是老规矩,先准备好接口函数。方便我们的页面组件拿到对…...
Docker入门指南:Linux系统下的完整安装步骤与常见问题解答
本文以centos7演示。 Docker安装 可参考官方安装文档:Install Docker Engine on CentOS | Docker Docs 一图流: # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…...
Netty实现数据上下行
Netty实现数据上下行 使用LVSNGinxNetty实现数据接入 在数据上行的时候,通过使用车辆唯一标识码(vin)和连接通道绑定 Netty一些配置参数如下: #netty项目使用的端口 server.port8017 #使用启用epoll(在Linux上拥有更好的传输性…...
【React】事件绑定:深入解析高效处理用户交互的最佳实践
文章目录 一、什么是事件绑定?二、基本事件绑定三、绑定 this 上下文四、传递参数五、事件对象六、事件委托七、常见事件处理八、优化事件处理 React 是现代前端开发中最受欢迎的框架之一,其组件化和高效的状态管理能力使得构建复杂的用户界面变得更加容…...
SpringCloud:使用OpenFeign优化前面的Nacos实现高效购物车商品信息处理
在现代电商系统中,购物车的性能直接影响用户的购物体验。为了提升系统性能和用户满意度,我们可以使用Spring Cloud的OpenFeign和负载均衡器来高效地处理购物车中的商品信息。本文将详细介绍如何在Spring Cloud中集成这些组件,并实现一个高效的…...
计算机三级嵌入式笔记(二)——嵌入式处理器
目录 考点1 嵌入式处理器的结构类型 考点2 嵌入式处理器简介 考点3 ARM处理器概述 考点4 处理器和处理器核 考点5 ARM 处理器的分类 考点6 经典 ARM 处理器 考点7 ARM Cortex 嵌入式处理器 考点8 ARM Cortex实时嵌入式处理器 考点9 ARM Cortex 应用处理器 考点10 AR…...
【GoLang】Golang 快速入门(第一篇)
目录 1.简介: 2.设计初衷: 3.Go语言的 特点 4.应用领域: 5.用go语言的公司: 6. 开发工具介绍以及环境搭建 1.工具介绍: 2.VSCode的安装: 3.安装过程: 4.Windows下搭建Go开发环境--安装和配置SDK 1.搭建Go开发环境 - 安装…...
Linux中的三类读写函数
文件IO和标准IO的区别 遵循标准: 文件IO遵循POSIX标准,主要在类UNIX环境下使用。标准IO遵循ANSI标准,具有更好的可移植性,可以在不同的操作系统上重新编译后运行。可移植性: 文件IO的可移植性相对较差,因为…...
MATLAB基础应用精讲-【数模应用】二元Probit回归分析
目录 前言 知识储备 二元Logistic模型和Probit模型 Logistic模型的形式 Probit模型 优势比(OR) 准二项分布族 算法原理 数学模型 二元因变量和线性概率模型 probit和logit回归 logit和probit模型的估计和推断 稳健性检验 二元logit回归分析全流程 一、案例数…...
找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)
回溯算法今天这几个题目做过,晚上有面试,今天水一水。 第一题:Leetcode77. 组合 题目描述 解题思路 从题目示例来看,k个数是不能重合的,但是题目没有明确说明这一点。 使用回溯算法解决此问题,利用树形…...
如何有效的进行小程序的优化
如今小程序已经成为了许多开发者开展业务,提供服务的重要平台 。所以如何有效的优化小程序成为了开发者关注的首要问题,以下是一份详细的小程序优化方案: 一、目标设定 明确小程序优化的主要目标,例如提高用户留存率、增加用户活…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
