当前位置: 首页 > 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;例如提高用户留存率、增加用户活…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...