【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.rhkb.cn/news/169425.html

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

相关文章

Vue的MVVM实现原理

目录 前言 用法 代码和效果图 效果图 理解 高质量的使用 前言 MVVM是Model-View-ViewModel的缩写&#xff0c;是一种软件架构设计模式。Vue.js实现了这种设计模式&#xff0c;通过双向数据绑定和虚拟DOM技术&#xff0c;使得数据和视图能够快速响应彼此的变化。了解Vue的…

unity中方向的两种表示:欧拉角和四元数

欧拉角&#xff1a;简单来说就是你可以选择 0度~360度 的范围 四元数&#xff1a;在计算机图像学中&#xff0c;四元数用于物体的旋转&#xff0c;是一种复杂&#xff0c;但效率较高的旋转方式 Quaternion结构体代表一个四元数&#xff0c;包含一个标量和一个三维向量&#x…

C# Onnx Yolov8 Detect 路面坑洼检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

leetcode 105. 从前序与中序遍历序列构造二叉树

2023.10.21 本题需要根据前序遍历序列和中序遍历序列来构造出一颗二叉树。类似于从中序与后序遍历序列构造二叉树 。使用递归&#xff0c; java代码如下&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

Monocular arbitrary moving object discovery and segmentation 论文阅读

基本信息 题目&#xff1a;Monocular Arbitrary Moving Object Discovery and Segmentation 作者&#xff1a; 来源&#xff1a;BMVC 时间&#xff1a;2021 代码地址&#xff1a;https://github.com/michalneoral/Raptor Abstract 我们提出了一种发现和分割场景中独立移动的…

VSCode 自动格式化

1.打开应用商店&#xff0c;搜索 prettier code formatter &#xff0c;选择第一个&#xff0c;点击安装。 2.安装完成后&#xff0c;点击文件&#xff0c;选择首选项&#xff0c;选择设置。 3.在搜索框内输入 save &#xff0c;勾选在保存时格式化文件。 4.随便打开一个文件&a…

nginx配置负载均衡--实战项目(适用于轮询、加权轮询、ip_hash)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

021-Qt 配置GitHub Copilot

Qt 配置GitHub Copilot 文章目录 Qt 配置GitHub Copilot项目介绍 GitHub Copilot配置 GitHub CopilotQt 前置条件升级QtGitHub Copilot 前置条件激活的了GitHub Copilot账号安装 Neovim 启用插件&#xff0c;重启Qt配置 GitHub Copilo安装Nodejs下载[copilot.vim](https://gith…

http post协议实现简单的rpc协议,WireShark抓包分析

文章目录 1.http 客户端-RPC客户端1.http 服务端-RPC服务端3.WireShark抓包分析3.1客户端到服务端的HTTP/JSON报文3.2服务端到客户端的HTTP/JSON报文 1.http 客户端-RPC客户端 import json import requests# 定义 RPC 客户端类 class RPCClient:def __init__(self, server_url…

基于多尺度分形残差注意力网络的超分辨率重建算法

1.引言 深度神经网络可以显著提高超分辨率的质量&#xff0c;但现有方法难以充分利用低分辨率尺度特征和通道信息&#xff0c;从而阻碍了卷积神经网络的表达能力。针对此类问题&#xff0c;本章提出了一种多尺度分形残差注意力网络&#xff08;Multi-scale Fractal Residual A…

Java NIO

Java NIO 一&#xff0c;介绍 Java NIO&#xff08;New IO&#xff09;是 JDK 1.4 引入的一组新的 I/O API&#xff0c;用于支持非阻塞式 I/O 操作。相比传统的 Java IO API&#xff0c;NIO 提供了更快、更灵活的 I/O 操作方式&#xff0c;可以用于构建高性能网络应用程序。 …

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第八部分:Linux、安全

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第八部分&#xff1a;Linux、安全前言Linux 文件系统解释应该知道的 18 个最常用的 Linux 命令HTTPS如何工作&#xff1f;数据是如何加密和解密的&#xff1f;为什么HTTPS在数据传输过程中会…

领导:给你一个项目,如何开展性能测试工作。我:***

01 怎么开展性能测试 01 测试的一般步骤 性能测试的工作是基于系统功能已经完备或者已经趋于完备之上的&#xff0c;在功能还不够完备的情况下没有多大的意义&#xff08;后期功能完善上会对系统的性能有影响&#xff0c;过早进入性能测试会出现测试结果不准确、浪费测试资源…

ESRI ArcGIS Desktop 10.8.2图文安装教程及下载

ArcGIS 是由美国著名的地理信息系统公司 Esri 开发的一款地理信息系统软件&#xff0c;它是目前全球最流行的 GIS 软件之一。ArcGIS 提供了图形化用户界面和数据分析工具&#xff0c;可以帮助用户管理、分析和可视化各种空间数据。ArcGIS Desktop是一个完整的桌面GIS软件套件&a…

20231024后端研发面经整理

1.如何在单链表O(1)删除节点&#xff1f; 狸猫换太子 2.redis中的key如何找到对应的内存位置&#xff1f; 哈希碰撞的话用链表存 3.线性探测哈希法的插入&#xff0c;查找和删除 插入&#xff1a;一个个挨着后面找&#xff0c;知道有空位 查找&#xff1a;一个个挨着后面找…

Ai写作创作系统ChatGPT网站源码+图文搭建教程+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

记一次渗透测试事件

一、漏洞发现 拿到登录的接口&#xff0c;丢到sqlmap里面跑一把&#xff0c;发现延时注入 进一步查询&#xff0c;发现是sa权限&#xff0c;直接os-shell whomai查询发现是管理员权限 os-shell执行命令太慢了&#xff0c;直接进行nc 反弹 执行base64 加密后的powershell命令&…

DALL·E 3怎么用?DALL·E 3如何申请开通 ?DALL·E 3如何免费使用?AI绘画教程来喽~

一、引言 DALLE 3 是 OpenAI 在上个月&#xff08;2023 年 9 月&#xff09;发布的一个文生图模型。 相对于 Midjourney 以及 Stable Diffusion&#xff0c;DALLE 3 最大的便利之处在于&#xff0c;用户不需要掌握 Prompt 的写法了&#xff0c;直接自然语言描述即可。 甚至还…

【文件操作】Java -操作File对象

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 文件操作 Java - File对象 Java - File对象 Fi…

ssm+vue的汽车站车辆运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的汽车站车辆运营管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…