Qt多进程-共享内存(Shared Memory)

在Qt中使用共享内存(Shared Memory)进行多进程程序开发,主要涉及以下步骤、代码示例和相关注意事项:

步骤:

  1. 创建共享内存区域
    • 使用QSharedMemory类来创建一个共享内存对象。
    • 设定一个唯一的共享内存键名,用于进程间标识和访问同一块共享内存。
  1. 挂载共享内存
    • 尝试将共享内存对象挂载(attach)到进程的地址空间。
    • 如果共享内存已经存在,需要判断其大小是否满足需求。
  1. 访问共享内存
    • 通过指针或引用直接操作共享内存中的数据。
    • 可以使用互斥锁(如QMutex)来同步不同进程对共享内存的访问,以避免数据竞争。
  1. 分离共享内存
    • 在不再需要访问共享内存时,应该将其从进程地址空间分离(detach)。
  1. 删除共享内存
    • 当所有进程都不再需要共享内存时,应该将其删除以释放系统资源。

代码示例:

以下是一个简化的Qt共享内存使用示例:

#include <QSharedMemory>  
#include <QDebug>  
#include <QByteArray>  
#include <QMutex>  
#include <QMutexLocker>  int main(int argc, char *argv[]) {  QCoreApplication a(argc, argv);  // 创建共享内存对象,并指定一个唯一的键名  QSharedMemory sharedMemory("mySharedMemoryKey");  // 设置共享内存的大小  if (!sharedMemory.create(1024) && sharedMemory.error() == QSharedMemory::AlreadyExists) {  // 共享内存已存在,尝试挂载它  if (!sharedMemory.attach()) {  qDebug() << "Unable to attach to existing shared memory segment.";  return -1;  }  }  // 锁定共享内存以安全访问  QMutex *mutex = new QMutex(QMutex::Recursive);  const char *to = static_cast<const char *>(sharedMemory.constData());  // 使用互斥锁保护共享内存的读写  QMutexLocker locker(mutex);  QByteArray data(to, sharedMemory.size());  qDebug() << "Read from shared memory:" << data;  // 写入数据到共享内存  QByteArray newData("Hello from another process!");  if (sharedMemory.size() < newData.size()) {  if (!sharedMemory.detach()) {  qDebug() << "Unable to detach from shared memory.";  return -1;  }  if (!sharedMemory.create(newData.size())) { // 重新设置大小  qDebug() << "Unable to resize shared memory segment.";  return -1;  }  }  void *toMem = sharedMemory.data(); // 获取指向共享内存的指针  memcpy(toMem, newData.constData(), newData.size()); // 复制数据到共享内存  // 分离并删除共享内存(如果这是最后一个使用该共享内存的进程)  if (!sharedMemory.detach()) {  qDebug() << "Unable to detach from shared memory.";  return -1;  }  // 注意:通常不在此处删除共享内存,除非你确定没有其他进程正在使用它。  return a.exec();  
}

注意事项:

  • 键名唯一性:确保为共享内存指定一个唯一的键名,以避免与其他应用程序的共享内存冲突。
  • 错误处理:始终检查QSharedMemory对象的错误状态,并适当处理任何错误。
  • 同步机制:当多个进程同时读写共享内存时,使用同步机制(如互斥锁)来避免数据竞争。
  • 内存大小:在创建共享内存时,要确保其大小足够存储所需数据。如果需要更改大小,可能需要先分离再重新创建。
  • 资源清理:不再需要共享内存时,应将其分离并酌情删除,以释放系统资源。但要注意确保没有其他进程仍在使用该共享内存。
  • 跨平台兼容性:Qt的QSharedMemory类提供了跨平台的共享内存访问能力,但不同的操作系统可能对共享内存的支持和实现有所不同。在编写跨平台应用时,要确保考虑到这些差异。

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

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

相关文章

R可视化:可直接发表的柱状图

可发表的柱状图 介绍 柱状图可视化 加载R包 knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE) library(tidyverse) library(ggpubr) library(plyr) library(ggprism)rm(list = ls()) options(stringsAsFactors = F)# group & color dose_names &…

IntelliJ IDEA中Terminate 与 Disconnect的区别

Terminate 与 Disconnect的区别 Terminate&#xff1a;关工具之前&#xff0c;先关闭运行中的项目&#xff08;kill pid的那种&#xff09; Disconnect&#xff1a;单纯关闭工具&#xff0c;通过工具启动的东西&#xff0c;依旧在运行

mstsc 远程银河麒麟桌

安装 1.银河麒麟终端apt-get安装xrdp sudo apt-get install -y xrdp 2.银河麒麟终端启动xrdp sudo systemctl start xrdp 3.银河麒麟终端检查3389端口 netstat -tnpl 4. win10电脑mstsc 远程桌面登录 在win10系统命令行&#xff0c;输入mstsc打开远程连接窗口&#xff…

AWS迁移与传输之Migration Hub

AWS Migration Hub是一种集中化的迁移管理服务&#xff0c;可帮助企业规划、跟踪和管理在亚马逊云中进行的各种迁移活动。包括应用程序迁移、数据库迁移、服务器迁移等。 AWS Migration Hub (Migration Hub) 提供一个位置来跟踪使用多个 AWS 工具和合作伙伴解决方案的迁移任务…

【全开源】民宿酒店预订管理系统(ThinkPHP+uniapp+uView)

民宿酒店预订管理系统 特色功能&#xff1a; 客户管理&#xff1a;该功能可以帮助民宿管理者更加有效地管理客户信息&#xff0c;包括客户的姓名、电话、地址、身份证号码等&#xff0c;并可以在客户的订单中了解客户的消费情况&#xff0c;从而更好地满足客户的需求&#xff…

【JavaEE初阶】HTTP协议|HTTP请求方法|GET|POST|GET和POST的区别|问题辨析

目录 认识"⽅法"(method) 1.GET⽅法 GET请求的特点 2.POST⽅法 POST请求的特点 &#x1f4a1;经典⾯试题:谈谈GET和POST的区别 &#x1f4a1;问题辨析&#xff1a; 3.其他⽅法 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂…

Cache 缓存实现类简单使用

Cache 缓存实现类 拿来当Redis用就行了&#xff0c;不过Hutool 缓存库主要是为了实现本地缓存&#xff1b;用在数据量不大&#xff0c;短期频繁访问的数据。 FIFO&#xff08;先进先出&#xff09;缓存&#xff1a;按照数据进入缓存的顺序&#xff0c;最先进入缓存的数据会被…

零基础学Java第二十五天之函数式接口

函数式接口 简介 函数式接口是指仅仅只包含一个抽象方法的接口&#xff0c;jdk1.8提供了一个FunctionalInterface注解来定义函数式接口&#xff0c;如果我们定义的接口不符合函数式的规范便会报错。配合Lambda表达式一起使用 四大核心函数式接口 函数式接口参数类型返回类型用…

【算法刷题day60】Leetcode:84. 柱状图中最大的矩形

文章目录 Leetcode 84. 柱状图中最大的矩形解题思路代码总结 草稿图网站 java的Deque Leetcode 84. 柱状图中最大的矩形 题目&#xff1a;84. 柱状图中最大的矩形 解析&#xff1a;代码随想录解析 解题思路 反方向接雨水。见上一篇文章 代码 class Solution {public int la…

六一儿童节创意项目:教你用HTML5和CSS3制作可爱的雪糕动画

六一儿童节快到了&#xff0c;这是一个充满童趣和欢乐的日子。为了给孩子们增添一份节日惊喜&#xff0c;我们决定用HTML5和CSS3制作一个生动有趣的雪糕动画。通过这个项目&#xff0c;不仅能提升你的前端技能&#xff0c;还能带给孩子们一份特别的节日礼物。无论你是前端开发新…

第一个Flutter3项目

配置flutter国内源 首先&#xff0c;配置flutter的国内源&#xff1a; env:PUB_HOSTED_URL"https://pub.flutter-io.cn"; env:FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn"配置gradle国内源 修改gradle\wrapper\gradle-wrapper.properties…

layui table在不发送请求时更新templet操作列

使用的layui的版本为2.4.5 更高的版本好像已经有了更新templet列的方法 而低版本的好像是没有 // 在列表中添加 templet: #opTpl , {field: opTpl, title: 操作, fixed: left, width: 290, templet: #opTpl}// 所定义的操作列按钮 <script id"opTpl" type"t…

组件的传参等

一:组件的生命周期函数 组件的生命周期函数: created只是创建了组件内的实例对象 attached,给组件实例绑定了属性,绑定到页面节点树之后 ready准备好渲染之后,还未渲染之前 moved组件实例被移动到另一个位置后执行 detached在整个组件被被移除执行 error执行的时候,组件内…

yolo 算法 易主

标题&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 论文&#xff1a;https://arxiv.org/pdf/2405.14458ethttps%3A//arxiv.org/pdf/2405.14458.zhihu.com/?targethttps%3A//arxiv.org/pdf/2405.14458 源码&#xff1a;https://github.com/THU-MIG/yolov10 分析…

N进制计数器【02】

大容量N进制计数器 集成计数器容量的扩展 集成计数器级联扩展容量 【例1】由两片 74LS161 级联组成 256 进制&#xff08;8位二进制&#xff09;同步加法计数器 【解】级联时&#xff0c;外加时钟信号同时接到各片计数器的时钟输入端&#xff0c;用前级计数器的进位输出 C…

Transformer模型架构笔记

0. 简介 Transformer是一种用于自然语言处理&#xff08;NLP&#xff09;和其他序列到序列&#xff08;sequence-to-sequence&#xff09;任务的深度学习模型架构&#xff0c;它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制&#xff08;self-attention …

JUC笔记

1、什么是 JUC JUC就是 java.util 下的工具包、包、分类等。 普通的线程代码&#xff1a; ThreadRunnable 没有返回值、效率相比入 Callable 相对较低&#xff01;Callable 有返回值&#xff01; 2、线程和进程 线程、进程&#xff0c;如果不能使用一句话说出来的技术&#x…

对北京新发地当时菜品三十天内价格分布式爬取(1)---(获取当时菜品数据并构建请求数据推入redis)

本次项目网页url 北京新发地: http://www.xinfadi.com.cn/priceDetail.html 我们首先创建一个爬虫用于收集url与请求的data然后b,c,d使用RedisCrawlSpider来对数据进行分布式爬取 在此篇中我们仅介绍爬虫a 一.获取当天所有菜品数据 这是一条请求的负载我们只需要对pubDateSta…

Objective-C爬虫:实现动态网页内容的抓取

在当今的互联网时代&#xff0c;数据的获取和分析变得日益重要。无论是进行市场研究、用户行为分析还是产品开发&#xff0c;获取大量数据都是不可或缺的一环。然而&#xff0c;很多有价值的信息都隐藏在动态加载的网页中&#xff0c;这些网页通过JavaScript动态生成内容&#…

本特利330180-51-00前置器在工业自动化中的应用与优势

本特利330180-51-00前置器在工业自动化中的应用与优势 作为PLC技术员&#xff0c;在工业自动化领域中&#xff0c;我们经常接触到各种传感器和前置器。其中&#xff0c;本特利330180-51-00前置器以其卓越的性能和广泛的应用领域&#xff0c;受到了业界的广泛关注。本文将详细介…