【QT开发(10)】QT 进程

文章目录

    • 1.1 运行一个新进程
    • 1.2 QProcess 还可以对一些信号进行关联
    • 2 进程间通信
    • 2.1 使用共享内存实现进程通信
    • 2.2 演示
  • 代码仓库
  • 参考

1.1 运行一个新进程

使用类 QProcess,允许将一个进程堪称一个顺序IO设备。

在Qt中,QProcess类是用于启动外部进程的类。它可以启动任何可执行文件,包括命令行工具和图形用户界面(GUI)应用程序。

启动一个线程分4步

1、在 窗口 类中添加一个私有成员类 QProcess myProcess;

#include <QProcess>
...namespace Ui {
class c;}class c : public QDialog
{Q_OBJECT
public:explicit c(QWidget *parent = nullptr);~c();QProcess myProcess;
private:Ui::c *ui;
};

2、在 ui 中添加一个 button 按钮,然后添加信号槽。

3、信号槽中增加启动进程

void c::on_pushButton_clicked()
{this->myProcess.start("xfce4-appfinder");// You can optionally wait for the program to finish by calling waitForFinished()  // process->waitForFinished();  
}

在这里插入图片描述

1.2 QProcess 还可以对一些信号进行关联

例如将 一个进程的信号和主页面进程的槽关联,实现进程信息显示到主进程。

1、在 主进程中添加私有槽申明

private slots:void showResult();void showState(QProcess::ProcessState);void showError();void showFinished(int,QProcess::ExitStatus);

在C++中,private slots: 和 private: 是用于定义类成员访问权限的关键字,但它们的作用略有不同。
private: 关键字用于将成员声明为私有访问权限,这意味着这些成员只能在类的内部访问,包括类的构造函数、方法等。在类的外部,这些成员是不可见的,即使用户试图访问它们也会导致编译错误。
而 private slots: 则是一种特殊的私有成员,用于在Qt框架中实现信号与槽机制。在这里,slots 是指明一个成员函数是一个Qt槽,它可以在类的外部通过信号调用。虽然这些槽函数是私有的,但它们可以通过信号从类的外部调用。
因此,将 private slots: 替换为 private: 将导致无法从外部调用槽函数,从而无法实现信号与槽机制。所以,这两个关键字是不能互换的。

2、构造函数中增加槽和信号的关联

c::c(QWidget *parent) :QDialog(parent),ui(new Ui::c)
{ui->setupUi(this);//sign combine with slotconnect(&myProcess,&QProcess::readyRead,this,&c::showResult);connect(&myProcess,&QProcess::stateChanged,this,&c::showState);connect(&myProcess,&QProcess::errorOccurred,this,&c::showError);connect(&myProcess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(showFinished(int,QProcess::ExitStatus)));

3、然后在 单击按钮的的槽中启动程序的代码

void c::on_pushButton_3_clicked()
{this->myProcess.start("gzip",QStringList()<<"-c");// wating to Startif (!myProcess.waitForStarted()){return;}// processthis->myProcess.write("qt",100);myProcess.closeWriteChannel();// wating ro finishif(!myProcess.waitForFinished()){return;}QByteArray result = myProcess.readAll();qDebug()<<"showresult2"<< result;
}

完成其他槽showResult()、showState()、showError()、showFinished()的代码

void c::showResult()
{debug::log("\n\n" \" This is a Empty project. \n" \" print some vals:\n" \"    int    = {0}\n" ,std::string{"myProcess.readAll()"});QTextCodec *codec = QTextCodec::codecForLocale();qDebug()<<"showresult"<< codec->toUnicode(myProcess.readAll());
}void c::showState(QProcess::ProcessState state)
{qDebug()<<"showState";if(state == QProcess::NotRunning){qDebug()<<"NotRunning";}else if (state == QProcess::Starting){qDebug()<<"Starting";}else{qDebug()<<"Runing";}
}
void c::showError()
{qDebug()<<"showError";
}
void c::showFinished(int,QProcess::ExitStatus exitStatus)
{qDebug()<<"showFinished";
}

实现了进程间的信号和槽的“互动”。

2 进程间通信

1、使用 TCP/IP
2、共享内存
3、 D-BUS
4、QProcess
5、会话管理

在这里插入图片描述

在这里插入图片描述

2.1 使用共享内存实现进程通信

1、使用QShareMemory 类,为其指定一个 key,拥有这个 key 就可以使用这个内存。
2、在 共享内存中加入数据loadFromFile();

  • 进程和共享内存分离;
  • 申请一个 QBuffer,将图像数据导入QBuffer
    QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),"*.jpg");QImage image;QBuffer buffer;buffer.open(QBuffer::ReadWrite);QDataStream out(&buffer);out << image;
  • 创建共享内存。使用create函数创建指定大小的共享内存段,单位是字节,该函数会自动将共享内存段连接到本进程。
int size =buffer.size();
sharedMemory.create(size);// 如果对其具有管理权限,每次都可创建,会删除旧的数据。
  • 对内存进行加锁。然后使用memcpy 进行数据拷贝。完成后解锁。数据加载到内存完成。
    sharedMemory.lock();char *to = (char *)sharedMemory.data();const char * from = buffer.data().data();memcpy(to,from,qMin(sharedMemory.size(),size));sharedMemory.unlock();// sharedMemory.detach();如果现在断开了这个连接,因为没有其他人在使用这个对象,就会被释放掉,因此不应该断开连接。

3、从共享内存中读取数据LoadFromMemory();

  • 和内存进行连接。
  • 然后使用 QBuffer 进行读取,记得这个过程需要加锁和解锁。
  • 进程和内存进行分离。
    sharedMemory.attach());QBuffer buffer;QDataStream in(&buffer);QImage image;sharedMemory.lock();buffer.setData((char *)sharedMemory.constData(),sharedMemory.size());buffer.open(QBuffer::ReadOnly);in >> image;sharedMemory.unlock();sharedMemory.detach();

我们启动两个程序,是两个进程。
左边的进程上运行:在 共享内存中加入数据loadFromFile();
右边的进程上运行:从共享内存中读取数据LoadFromMemory();

可以在2.2 的演示中看到效果。

需要注意的是,我们左边进程,如果运行LoadFromMemory();,会导致共享内存直接被释放掉,就会导致右边的进程无法使用这个共享进程了。
如果把LoadFromMemory(); 中释放内存的代码删除,会导致,两个进程都不释放共享内存。在左边进程想更新这个内存sharedMemory.create(size);时可能会报错。

需要设计这个状态机过程,起始还是有点琐碎的。

2.2 演示

请添加图片描述

代码仓库

https://gitee.com/hiyanyx/qt5.14-cpp_dds_-project/tree/QTProcess
分支:QTProcess

参考

《Qt Creator快速入门_第三版__霍亚飞编著.pdf》

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

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

相关文章

大模型与知识图谱如何相互助力

目前各行各业在数字化、智能化发展的大势所趋下&#xff0c;信息新技术不断涌现&#xff0c;也在加快深入融合到传统实体行业应用中&#xff0c;比如知识图谱、人工智能、数字孪生等等&#xff0c;特别是基于人工智能的大模型在去年底被chatgpt的带领下涌现出一波又一波的浪潮&…

驱动开发1 概念、内核模块编程、内核消息打印函数printk函数的使用、内核模块传参、内核导出符号

1 驱动相关概念 2 内核模块编程 内核模块编写实例代码注释 #include <linux/init.h> #include <linux/module.h>//入口函数&#xff0c;安装内核模块时执行 static int __init mycdev_init(void) {//static 修饰当前函数只能在本文件使用//int 函数的返回值类型&a…

【Leetcode】【中等】1726.同积元组

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/tuple-with-same-product/ 给你…

适用于 Mac 电脑的 10 款最佳数据恢复工具集

无论是个人照片还是重要的商业文档&#xff0c;对于那些依赖计算机获取重要文件的人来说&#xff0c;数据丢失都是一场噩梦。 值得庆幸的是&#xff0c;Mac用户可以使用各种数据恢复工具&#xff0c;可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c;我们将采用适用于…

Arrays 中的 asList()方法

public static <T> List<T> asList&#xff08; T . . . a &#xff09;{ return new ArrayList<>&#xff08;a&#xff09;&#xff1b; } 返回由指定数组支持的固定大小的 list集合。对数组所做的更改将在返回的 l…

【USRP】通信之有线通信

有线通信&#xff1a; 有线通信是指使用物理线路或媒体&#xff08;例如&#xff0c;铜线、同轴电缆、光纤&#xff09;进行数据、声音和视频传输的通信方式。由于它依赖于实体传输媒介&#xff0c;有线通信通常具有较高的稳定性和可靠性&#xff0c;并能支持长距离的高带宽通…

input框输入中文时,输入未完成触发事件。Vue中文输入法不触发input事件?

前言 在做搜索输入框时&#xff0c;产品期待实时搜索&#xff0c;就是边输入边搜索&#xff0c;然而对于中文输入法出现的效果&#xff0c;不同的产品可能有不同的意见&#xff0c;有的觉得输入未完成也应该触发搜索。但有的却认为应该在中文输入完成后再触发搜索。我发现在vu…

Docker Swarm 集群搭建

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.准备主机 搭建一个 docker swarm 集群&#xff0c;包含 5 个 swarm 节点。这 5 个 swarm 节点的 IP 与暂 时的角色分配如下&#xff08;注意&#xff0c;搭建完成后会切换角色&#xff…

23年上半年上午题复习

敏捷方法 耦合 软件维护 消息 面向对象测试 面向对象设计原则 包图 原型模式 数据库三级模型 数据库函数依赖 哈夫曼树 左0右1 折半查找 画一个折半查找树&#xff0c;这个树只会往一个方向查找&#xff0c;一个节点不会同时出现左右子树&#xff0c;较小的作为左子树&#…

git将当前分支A强制推送远程分支pro上

前言 开发中基于线上分支pro创建了A分支&#xff0c;开发完成之后。又基于线上分支pro创建了B分支&#xff0c;都以此合并到测试分支&#xff0c;两个分支更改中都动用部分共同的文件&#xff0c;这就导致后续开发合并代码越来越乱&#xff0c;这时你想把本地开发的分支强推到…

数据库设计阶段-架构真题(五十七)

下面关于联合需求计划JRP叙述&#xff0c;不正确的是&#xff08;&#xff09;。 JRP是一种相对成本较高但十分有效的需求获取方法在讨论期间尽量避免使用专业术语JRP的主要目的是对需求进行分析和验证在JRP实施之前&#xff0c;应制定详细的议程&#xff0c;并严格遵照议程进…

力扣每日一题57:插入区间

题目描述&#xff1a; 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#x…

通义大模型使用指南之通义千问

一、注册 我们可以打开以下网站&#xff0c;用手机号注册一个账号即可。 通义大模型 (aliyun.com) 二、使用介绍 如图&#xff0c;我们可以看到有三个大项功能&#xff0c;通义千问、通义万相、通义听悟。下来我们体验一下通义千问的功能。 1、通义千问 通义千问主要有两个功能…

如何使用VSCode将iPad Pro转化为功能强大的开发工具?

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

# 开发趋势 Java Lambda 表达式 第三篇

开发趋势 Java Lambda 表达式 第三篇 一&#xff0c;Lambda 整合集合常规操作 List Java Lambda 表达式可以与List集合和常规操作进行整合&#xff0c;以提供一种更简洁、更可读的代码编写方式。以下是几个示例&#xff1a; 集合遍历操作&#xff1a; List<String> n…

【分布式缓存】关于 Memcached 的几个常见问题

关于 Memcached 的几个常见问题 1.Memcached 是怎么工作的&#xff1f;2.Memcached 最大的优势是什么&#xff1f;3.Memcached 和 MySQL 的 querycache 相比&#xff0c;有什么优缺点&#xff1f;4.Memcached 和服务器的 local cache&#xff08;比如 PHP 的 APC、mmap 文件等&…

使用IO流完成项目实战水果库存系统

以下内容本人都是在 Maven 工程下总结的 需求介绍显示主菜单让程序无线运行下去加载数据显示库存列表根据名称查找特定库存记录添加库存记录查看_下架_退出功能实现持久化数据 package com.csdn.fruit.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lom…

Http长连接同一个socket多个请求和响应如何保证一一对应?

HTTP/2引入二进制数据帧和流的概念&#xff0c;其中帧对数据进行顺序标识&#xff0c;如下图所示&#xff0c;这样浏览器收到数据之后&#xff0c;就可以按照序列对数据进行合并&#xff0c;而不会出现合并后数据错乱的情况。同样是因为有了序列&#xff0c;服务器就可以并行的…

使用Packstack安装器安装一体化OpenStack云平台

【实训目的】 初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 【实训准备】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建…

【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果

文章目录 前言一、Feign 整合 Sentinel1.1 实现步骤1.2 FallbackFactory 示例 二、Sentinel 实现隔离2.1 隔离的实现方法2.2 Sentinel 实现线程隔离示例 三、熔断降级规则3.1 熔断降级原理及其流程3.2 熔断策略 —— 慢调用3.3 熔断策略 —— 异常比例和异常数 四、授权规则4.1…