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

Qt进程间通信

QSharedMemory共享内存Shared Memory是一种进程间通信Inter-Process Communication, IPC机制允许多个进程共享同一块内存区域。共享内存提供了高效的数据交换方式适用于需要频繁传递大量数据的场景。Qt中的共享内存机制主要依赖于QSharedMemory类。该类提供了用于创建和管理共享内存区域的接口允许进程在内存中创建一个共享的数据缓冲区.使用步骤创建共享内存使用QSharedMemory类的create()函数可以创建一个共享内存对象并指定一个唯一的键key来标识共享内存区域。如果该键对应的共享内存已经存在则会返回false。分配内存使用QSharedMemory类的attach()函数将共享内存附加到当前进程的地址空间。写入和读取数据通过共享内存附加到的地址进程可以直接读取或写入共享内存中的数据。可以使用任何数据结构如数组、结构体等来组织共享的数据。分离和删除共享内存当进程不再需要访问共享内存时可以使用QSharedMemory类的detach()函数将共享内存从当前进程的地址空间中分离。而使用QSharedMemory类的remove()函数可以删除共享内存区域释放相关资源。跨平台特性差异windows内核自动回收进程退出后内存自动释放linuxQSharedMemory 持有需显式调用析构函数示例写入端#includeQtCore/QCoreApplication#includeQSharedMemory#includeQDebug#includeQThread#includeqmath.hintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QSharedMemory*shared_mmnewQSharedMemory();shared_mm-setKey(my_shared_data);if(!shared_mm-attach(QSharedMemory::ReadWrite)){shared_mm-create(20,QSharedMemory::ReadWrite);intno0;QString ret;while(true){no1;shared_mm-lock();retQString(shared no:%0).arg(no);memset(shared_mm-data(),0,shared_mm-size());memcpy(shared_mm-data(),ret.toStdString().data(),qMin(ret.size(),shared_mm-size()));shared_mm-unlock();QThread::sleep(2);qDebug()ret;}}else{qDebug()app1 attach my_shared_data failed!;}returna.exec();}读取端#includeQtCore/QCoreApplication#includeQSharedMemory#includeQDebug#includeQThread#includeqmath.hintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QSharedMemory*shared_mmnewQSharedMemory();shared_mm-setKey(my_shared_data);if(!shared_mm-attach(QSharedMemory::ReadWrite)){shared_mm-create(20,QSharedMemory::ReadWrite);intno0;QString ret;while(true){no1;shared_mm-lock();retQString(shared no:%0).arg(no);memset(shared_mm-data(),0,shared_mm-size());memcpy(shared_mm-data(),ret.toStdString().data(),qMin(ret.size(),shared_mm-size()));shared_mm-unlock();QThread::sleep(2);qDebug()ret;}}else{qDebug()app1 attach my_shared_data failed!;}returna.exec();}如果是一个进程写多个进程读的场景可以考虑内存分页不同的进程读取不同的内存段# 示例代码constintPAGE_SIZE2048;// 内存页2kintapp_page2;memcpy(shared_mm-data()2*PAGE_SIZE,ret.toStdString().data(),qMin(ret.size(),shared_mm-size()));QSystemSemaphore如果两端都需要写入需要借助系统信号来控制读、写的时机信号量为0时会阻塞线程或进程。app1初始化‘sys_shared_semaphore1’、‘sys_shared_semaphore2’两个信号量同时启动时初始化‘my_shared_data’共享存储区。app1向共享存储区写入数据设置sys_shared_semaphore1的信号量为1然后等待sys_shared_semaphore2获取到信号量后读取数据。#includeQtCore/QCoreApplication#includeQSharedMemory#includeQDebug#includeQThread#includeQMath.h#includeQSystemSemaphoreintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QSystemSemaphoresemaphore1(sys_shared_semaphore1,0);QSystemSemaphoresemaphore2(sys_shared_semaphore2,0);QSharedMemory*shared_mmnewQSharedMemory();shared_mm-setKey(my_shared_data);charbuff[20]{0};if(!shared_mm-attach(QSharedMemory::ReadWrite)){shared_mm-create(20,QSharedMemory::ReadWrite);intno0;QString ret;while(true){no1;shared_mm-lock();retQString(app1 no:%0).arg(no);memset(shared_mm-data(),0,shared_mm-size());memcpy(shared_mm-data(),ret.toStdString().data(),qMin(ret.size(),shared_mm-size()));shared_mm-unlock();semaphore1.release(1);if(semaphore2.acquire()){memset(buff,0,20);shared_mm-lock();memcpy(buff,shared_mm-constData(),sizeof(buff));qDebug()read sharememory:buff;shared_mm-unlock();}}}else{qDebug()app1 attach my_shared_data failed!;}returna.exec();}app2与app1差不多启动后先附加‘my_shared_data’附加成功表示app1已经启动然后等待sys_shared_semaphore1信号获取信号后读取数据。app2向共享存储区写入数据后设置sys_shared_semaphore2的信号量为1此时app1获取信号后可以读取数据。#includeQtCore/QCoreApplication#includeQSharedMemory#includeQDebug#includeQThread#includeQMath.h#includeQSystemSemaphoreintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QSystemSemaphoresemaphore1(sys_shared_semaphore1,0);QSystemSemaphoresemaphore2(sys_shared_semaphore2,0);QSharedMemory*shared_mmnewQSharedMemory();shared_mm-setKey(my_shared_data);while(true){if(shared_mm-attach(QSharedMemory::ReadWrite))break;QThread::msleep(1000);qDebug()wait sharememory attach...;}intno0;QString ret;charbuff[20]{0};while(true){no1;if(semaphore1.acquire()){memset(buff,0,20);shared_mm-lock();memcpy(buff,shared_mm-constData(),sizeof(buff));qDebug()read sharememory:buff;shared_mm-unlock();}shared_mm-lock();retQString(app2 no:%0).arg(no);memset(shared_mm-data(),0,shared_mm-size());memcpy(shared_mm-data(),ret.toStdString().data(),qMin(ret.size(),shared_mm-size()));shared_mm-unlock();semaphore2.release(1);}returna.exec();}QtROQt Remote Object (QtRO)也是一个用于进程间通信IPC的模块专门用于在不同进程或计算机之间交换信息。它在Qt 5.9之后推出基于Socket封装兼容LPCLocal Process Communication和RPCRemote Process Communication。为了实现远程对象调用QtRO使用了一种基于信号和槽的机制类似于Qt本地对象之间的通信。qt工程中QtRO依赖 network、remoteobjects两个模块rep文件rep文件中包含了通信之间定义的接口。// 文件名app_rep_intf.rep class AppRemoteInterface { SIGNAL(signalMsg(const QString )) //server下发消息给client SLOT(int onMsg(const QString )) //server接收client的消息 }serverrep_app_rep_intf_source.h 是app_rep_intf.rep生成的.pro文件中需要添加REPC_SOURCE $$PWD/app_rep_intf.repvs 工程中需要设置app_rep_intf.rep属性out file typesource (Source header)#pragma once #include QDebug #include rep_app_rep_intf_source.h class AppRemoteInterface :public AppRemoteInterfaceSource { Q_OBJECT public: AppRemoteInterface(QObject *parent nullptr) : AppRemoteInterfaceSource() { } virtual int onMsg(const QString msg); void sendMsgToClient(const QString msg); signals: void signalRevMsg(const QString msg); }; #include appremoteinterface.h int AppRemoteInterface::onMsg(const QString msg) { emit signalRevMsg(msg); return 0; } void AppRemoteInterface::sendMsgToClient(const QString msg) { emit signalMsg(msg); }main.cpp#include QtCore/QCoreApplication #include QRemoteObjectHost #include QDebug #include QTimer #include appremoteinterface.h int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QRemoteObjectHost app_host; app_host.setHostUrl(QUrl(local:apprmt)); AppRemoteInterface *app_int new AppRemoteInterface(); app_host.enableRemoting(app_int); qDebug() server app running....; QObject::connect(app_int, AppRemoteInterface::signalRevMsg, [](const QString msg) { qDebug() server recv: msg; }); QTimer timer; QObject::connect(timer, QTimer::timeout, [app_int]() { app_int-sendMsgToClient(this is server msg!); }); timer.start(3000); return a.exec(); }clientrep_app_rep_intf_replica.h 是app_rep_intf.rep生成的.pro文件中需要添加REPC_REPLICA app_rep_intf.repvs 工程中需要设置app_rep_intf.rep属性out file typereplica (Replica header)#includeQtCore/QCoreApplication#includeQRemoteObjectHost#includeQDebug#includeQTimer#includeQMetaObject#includerep_app_rep_intf_replica.hintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QRemoteObjectNode app_node;AppRemoteInterfaceReplica*app_infapp_node.acquireAppRemoteInterfaceReplica();app_node.connectToNode(QUrl(local:apprmt));QObject::connect(app_inf,AppRemoteInterfaceReplica::signalMsg,[](constQStringmsg){qDebug()client recv:msg;});QTimer timer;QObject::connect(timer,QTimer::timeout,[app_inf](){if(app_inf-isReplicaValid()){app_inf-onMsg(this is client msg);// 直接调用服务端的SOLT}});timer.start(3000);returna.exec();}

相关文章:

Qt进程间通信

QSharedMemory 共享内存(Shared Memory)是一种进程间通信(Inter-Process Communication, IPC)机制,允许多个进程共享同一块内存区域。共享内存提供了高效的数据交换方式,适用于需要频繁传递大量数据的场景。…...

Hive数仓分区设计与更新操作指南

目录 一、Hive 分区概述 1.1 分区的核心作用 1.2 分区的本质示例 二、分区设计原则 2.1 分区字段选择原则 2.2 分区粒度与数量控制 2.3 分区设计常见误区 三、分区表的创建 3.1 静态分区表 3.1.1 创建静态分区表 3.1.2 向静态分区表插入数据 3.2 动态分区表 3.2.1 …...

2026年最新免费5S管理系统盘点!盘点10个免费的5S系统!

在2026年制造业数字化转型的关键节点,寻找一套高效且低成本的5S管理系统已成为众多中小企业的迫切需求。面对市场上繁杂的软件选择,如何精准定位到真正的免费5S系统?本文为您带来2026年最新免费5S管理系统盘点,深度剖析当前市场格…...

一、STM32入门

用的是正点原子STM32F103MINI、JLINK v8 1.准备工作 1.1手册 1.1.1数据手册 STM32F103RCT6 开发板各个元件的特性。 1.1.2参考手册 在逻辑层面上,如何利用STM32F10X开发板各个部位的特性实现各种功能。 1.1.3厂家的学习开发手册 具体厂家设计的代码层面的如何学…...

《UNIX高级环境编程》第十三章 守护进程(一文读懂UNIX下守护进程)

一、守护进程的特征守护进程是一种生命周期较长的进程,常常在系统启动时被运行,在系统关闭时终止,并且没有关联的终端设备,是一个后台进程。一个系统中,父进程ID为0的一般是内核进程。进程1通常是init进程,…...

杰理AC695N/AC696N歌词回调

想要连接蓝牙播放音乐显示歌词杰理的SDK已经做好封装了, 等待我们去调用就可以了, ac695n和ac696n的sdk调用方法都一样下面开始还有一点最重要的是下面这个宏必须要打开, 最后连接蓝牙播放音乐就能在日志打印中看到歌词的回调了还有一个做法是可以把A2DP的这个宏关掉, 然后就可…...

配置中心的作用?Nacos 配置中心原理?

一句话回答:配置中心的作用,就是把分散在各个服务里的配置统一集中管理,并支持动态推送和环境隔离,避免每次改配置都去改代码、重启服务。 Nacos 官方也把自己定位成“动态配置服务”,强调配置的中心化、外部化和动态化…...

NPM Script 实战:常用命令设计与封装|Vue 工程化篇

【NPM Script】Vue 前端工程化实操:从核心封装逻辑到落地,彻底搞懂 npm run 常用命令最佳写法,避开端口占用、环境变量、多环境构建高频坑! 📑 文章目录 开篇一、NPM Script 是什么?为什么用它&#xff1f…...

KMP算法之 next 数组的计算

/*** brief 计算模式串的next数组(部分匹配表),并可视化计算过程* param pattern 模式串(待查找的基因片段)* param next 输出参数:存储next数组(长度需≥模式串长度)*/ void kmp_ge…...

发电机组并网技术研究

一、概述在现代电力供应体系中,柴发机组作为应急电源或后备电源,是应对市电中断、用电高峰负荷及特殊场景电力需求,保障电力持续、稳定供应的关键核心设备,其典型应用系统如下图1所示(图1:柴发机组典型供电…...

负载均衡策略有哪些?如何自定义?

你先记一句总纲:负载均衡策略,就是当一个服务有多个实例时,客户端或网关该按什么规则选一个实例去调用。常见负载均衡策略1. 轮询 Round Robin按顺序一个一个分配请求:第1个请求给实例A第2个请求给实例B第3个请求给实例C优点是简单…...

深度解构 BeyondMimic 引导扩散控制策略

深度解构 BeyondMimic 引导扩散控制策略 引导扩散就是先利用 Tracking 的方式训练出多个可以实现各种动作的小模型,随后利用这些小模型在仿真中生成大量的数据,用来训练出一个大模型,也就是蒸馏。但这里用的不是传统的蒸馏手段,我…...

全球爆火的龙虾杀入科研智能体赛道,字节跳动、微软以及英伟达等巨头也早已布局AI4Science领域

小罗碎碎念 如果说2020年至2023年是以AlphaFold为代表的模型在静态数据映射和结构预测上取得历史性突破的阶段,那么2025至2026年则标志着科学智能正式迈入“智能体(Agentic AI)”时代 。 在这一全新阶段,人工智能不再仅仅是被动…...

leetcode 1394. Find Lucky Integer in an Array 找出数组中的幸运数-耗时100

Problem: 1394. Find Lucky Integer in an Array 找出数组中的幸运数 耗时100%&#xff0c;固定数组统计频次&#xff0c;从高到低判断频次和数值是否相等 Code class Solution { public:int findLucky(vector<int>& arr) {vector<int> freq(501, 0);for(int&…...

leetcode 困难题 1392. Longest Happy Prefix 最长快乐前缀

Problem: 1392. Longest Happy Prefix 最长快乐前缀 滚动哈希的&#xff0c;取基26&#xff0c;模1e9 11&#xff0c;首先求出字符串的前缀哈希&#xff0c;前缀哈希用到了滚动哈希计算方式 后缀哈希&#xff0c;可以直接套公式求 像cbcb&#xff0c;前缀哈希这么算&#xf…...

AI新范式 02|拆解世界模型:它是如何理解物理规律的?

当AI学会了“重力加速度”&#xff0c;它就真正开始理解这个世界引言&#xff1a;从“知其然”到“知其所以然” 在第一篇中&#xff0c;我们谈到2026年是“世界模型元年”&#xff0c;NVIDIA Cosmos、Google DeepMind Genie等代表性工作正在重塑AI对物理世界的理解。但一个核心…...

告别绘图软件!Paperxie AI 科研绘图:10 次免费额度,让理工科论文可视化一步到位

paperxie科研绘图https://www.paperxie.cn/drawinghttps://www.paperxie.cn/drawing 在科研写作与论文发表的路上&#xff0c;「科研绘图」永远是那道绕不开的坎&#xff1a;Matplotlib 代码写了几百行还是跑不出理想图表&#xff0c;Origin 复杂的操作界面让新手望而却步&…...

环境变量与虚拟地址空间

环境变量与虚拟地址空间环境变量&#xff08;1&#xff09;问题引入&#xff08;2&#xff09;引入环境变量&#xff08;3&#xff09;环境变量和c代码关系1.用代码获取环境变量2.作用(4)添加环境变量&#xff08;5&#xff09;删除环境变量&#xff08;6&#xff09;set环境变…...

从零开始了解数据采集——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

2026 本科生论文工具盘点:9 款 AI 工具搞定初稿 / 绘图 / 排版 / AI 率

一、写在前面&#xff1a;论文季的「工具焦虑」&#xff0c;你需要一份精准选型指南 又到毕业季&#xff0c;朋友圈里满是「论文写到凌晨三点」「格式改到崩溃」「AI 率超标被导师打回」的吐槽。写毕业论文从来不是「敲字」那么简单&#xff1a;从选题定方向、初稿生成&#x…...

cpp刷题打卡20——前k个高频元素

前k个高频元素 题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 题目代码&#xff1a; class Solution { public:class Mycompare{public:bool operator()(pair<int, int>&…...

基于docker的LLM服务部署

下载 拿qwen-3.5-9B 为例&#xff1a; https://www.modelscope.cn/models/Qwen/Qwen3.5-9B 首先下模型 git lfs install git clone https://www.modelscope.cn/Qwen/Qwen3.5-9B.git 然后下对应docker,框架我用的是vllm docker pull vllm/vllm-openai:qwen3_5 &#xff08;官…...

城市环境监测传感器—实时监测与分析环境数据

城市环境监测传感器是智慧城市建设中不可或缺的“感知神经”&#xff0c;通过实时监测与分析环境数据&#xff0c;为城市治理、生态保护与居民健康提供科学支撑。能够测量环境中的氧气、二氧化碳、氮气等气体成分&#xff0c;以及温度、湿度、噪音等参数。部分传感器还集成气象…...

【开题答辩全过程】以 户外用品比价系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

C的数组概念

一、一维数组1.1 概念数组是一组相同数据类型的元素的集合&#xff0c;这些元素在内存中是连续存储的&#xff0c;并且通过一个唯一的数组名称和索引来访问。1.2 定义一维数组的定义语法格式&#xff1a;数据类型 数组名 [元素个数];1.3 访问与操作1.3.1 访问访问数组元素通过下…...

电商系统商品管理模块避坑指南:Spring Boot+MySQL+Redis多数据源配置实战

电商系统商品管理模块避坑指南&#xff1a;Spring BootMySQLRedis多数据源配置实战 在电商系统开发中&#xff0c;商品管理模块作为核心业务组件&#xff0c;其稳定性和性能直接影响用户体验和平台收益。本文将深入剖析基于Spring Boot框架的多数据源配置实践&#xff0c;结合M…...

RK3588 Android 12 异显功能开发实战:命令行与Presentation双方案解析

1. 初识RK3588的异显能力&#xff1a;不止是“多接一个屏幕” 如果你手头有一块搭载了瑞芯微RK3588芯片的开发板&#xff0c;比如Firefly的ITX-3588J或者Rock 5B&#xff0c;并且已经刷好了Android 12系统&#xff0c;那你手里握着的其实是一个“多屏怪兽”的潜力股。很多朋友刚…...

新手必看:ARM、树莓派、Arduino和单片机到底该怎么选?从零到一的硬件开发指南

从零到一&#xff1a;如何为你的创意项目挑选最合适的硬件平台 最近几年&#xff0c;身边想动手做点“智能硬件”的朋友越来越多了。有人想给阳台的花花草草做个自动浇水器&#xff0c;有人想改造家里的灯光实现语音控制&#xff0c;还有人雄心勃勃地想从零开始造一台迷你机器人…...

短链接服务选型指南:自建vs第三方API?从Bitly到PicSee的5大商业方案横评

短链接服务选型实战&#xff1a;企业技术决策者的成本、功能与场景化评估指南 在数字营销与用户运营的日常工作中&#xff0c;我们几乎每天都在与链接打交道。无论是电商大促的活动页面、社交媒体上的新品预告&#xff0c;还是内部系统生成的冗长报表地址&#xff0c;一个简洁、…...

2024年网络异常检测避坑指南:为什么你的ELK+Suricata方案总漏报?

2024年企业级网络异常检测实战指南&#xff1a;从规则引擎到AI驱动的技术跃迁 当企业网络流量以每年30%的速度增长时&#xff0c;传统安全设备的告警面板正在变成"狼来了"的故事现场。某金融科技公司的安全团队负责人曾向我展示他们的监控大屏&#xff1a;每天超过2万…...