QT之QSharedMemory共享内存
QSharedMemory是qt提供对共享内存操作的类,主要用来对内存卡写数据和读数据。
常用api:
1、void QSharedMemory::setKey(const QString &key)
为共享内存设置键值。如何当前的内存共享对象已经链接到底层的共享内存段(isAttached),则在设置新的键值前分离开(detach)。
2、bool QSharedMemory::create(int size, QSharedMemory::AccessMode mode = ReadWrite)
该函数根据共享内存的Key值来创建一个size大小的共享内存段,可以根据mode设为ReadWrite可读可写或者ReadOnly只读模式。
3、bool QSharedMemory::attach(QSharedMemory::AccessModemode= ReadWrite)该函数将会依据共享内存对象的Key值,来将共享内存对象与实际的共享内存逻辑地址相链接,这样进程就可以通过QSharedMemory对象来访问实际的共享内存了。4、bool QSharedMemory::detach() 将进程与共享内存段分离。如果这是链接到共享内存段的最后一个进程,那么这个共享内存段将被系统释放,也就是说,共享内存中的内容将被销毁。
5、bool QSharedMemory::lock() 这是一个可以锁住共享内存段以供该进程访问的信号量。当进程对共享内存进程操作时,为防止其它进程也对该内存进行改动从而操作数据不同步的情况,需要将内存进行锁定,也就是lock。6、bool QSharedMemory::unlock() 当对共享内存操作完成后,需要释放共享内存段上的锁。否则其它进程无法对共享内存进行任何操作。发送端代码:
void QtWidgetsSendData::writeSharedMemory(QImage img)
{
if (mSharedMemSender == nullptr)
{
mSharedMemSender = new QSharedMemory();
// 设置共享内存区域Key
mSharedMemSender->setKey("PicShared");
if (mSharedMemSender->isAttached())
{
mSharedMemSender->detach();
}
// 获取需要共享的数据大小
int r = mSharedMemSender->size();
// 创建共享内存区域
auto hh = mSharedMemSender->create(588810);
}
QBuffer buffer;
buffer.open(QIODevice::ReadWrite);
// 创建QDataStream对象并指定数据存储对象为buffer
QDataStream inStream(&buffer);
// 将图片数据传入
inStream << img;
// 将共享内存区域锁定
mSharedMemSender->lock();
//写入数据
memcpy((char*)mSharedMemSender->data(), (char*)buffer.data().data(), buffer.size());
// 将共享内存区域解锁
mSharedMemSender->unlock();
}
接受端代码:
void QtWidgetsReceiveData::readSharedMemory()
{
QSharedMemory sharedMemReceiver;
// 设置共享内存区域Key
sharedMemReceiver.setKey("PicShared");
// 将共享内存区域与程序挂接
int rr = sharedMemReceiver.isAttached();
int r = sharedMemReceiver.attach();
auto test = sharedMemReceiver.errorString();
//qDebug() << "创建共享内存失败: " << sharedMemReceiver.errorString();
// 将共享内存区域锁定
sharedMemReceiver.lock();
// 获取共享内存大小(此处相当于数据大小)
int size = sharedMemReceiver.size();
QBuffer buffer;
// 将共享内存的数据设置到buffer容器中
buffer.setData((char*)sharedMemReceiver.constData(), size);
// 然后以只读的方式打开
buffer.open(QBuffer::ReadOnly);
// 创建QDataStream对象读取数据,并指定数据buffer
QDataStream outStream(&buffer);
// 创建QImage并通过数据流对象将图片数据写入
QImage img;
outStream >> img;
// 将共享内存解锁
sharedMemReceiver.unlock();
// 将挂接的共享内存与程序分离
sharedMemReceiver.detach();
ui.label_srcImage->setPixmap(QPixmap::fromImage(img));
}
相关文章:
QT之QSharedMemory共享内存
QSharedMemory是qt提供对共享内存操作的类,主要用来对内存卡写数据和读数据。 常用api: 1、void QSharedMemory::setKey(const QString &key) 为共享内存设置键值。如何当前的内存共享对象已经链接到底层的共享内存段(isAttached)&…...

string 类 经典习题之数字字符相加
题目: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 题目来源࿱…...
通讯录——C语言实现
头文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一个人的信息 //struct…...

优思学院|3步骤计算出Cpk|学习Minitab
在生产和质量管理中,准确了解和控制产品特性至关重要。一个关键的工具是Cpk值,它是衡量生产过程能力的重要指标。假设我们有一个产品特性的规格是5.080.02,通过收集和分析过程数据,我们可以计算出Cpk值,进而了解生产过…...
【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异
JDK、JRE与JVM:揭开Java运行环境的神秘面纱 在Java开发者的日常工作中,JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境,但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系&…...
Linux中的touch命令
在Linux中,touch命令主要用于创建空的文件或者更新已存在文件的时间戳。下面是 touch命令的使用方式和示例说明: 创建空文件 要创建一个空文件,可以使用 touch命令并指定文件名,如下所示: touch new_fi…...

智能驾驶规划控制理论学习-基于采样的规划方法
目录 一、基于采样的规划方法概述 二、概率路图(PRM) 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树(RRT) 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…...

二叉树——二叉树所有路径
二叉树所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2->5","1-…...
算法训练营day38(补),动态规划6
package main func max(a, b int) int { if a > b { return a } return b } 背包最大重量为4。 物品为: 重量价值物品0115物品1320物品2430 每件商品都有无限个! 问背包能背的物品最大价值是多少? func package03(weight, value []…...
【java、微服务、nacos】nacos服务分级存储模型
Nacos服务分级存储模型 ① 一级是服务,例如userservice ②二级是集群,例如杭州或上海 ③ 三级是实例,例如杭州机房的某台部署了userservice的服务器 配置实例集群属性 改变服务的yml文件 spring:cloud:nacos:discovery:cluster-name: H…...
共享旅游卡:打开0费用旅游新纪元,探索40+精彩线路
随着现代生活节奏的加快,旅游成为了许多人释放压力、寻求乐趣的方式。然而,面对琳琅满目的旅游线路和不断上涨的旅游费用,许多人望而却步。 今天,我们要为您介绍一种颠覆传统旅游方式的创新产品——共享旅游卡。它不仅能让您以0费…...

MQTT协议解析:揭秘固定报头、可变报头与有效载荷的奥秘
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级的通讯协议,常用于远程传感器和控制设备的通讯。MQTT协议基于发布/订阅模式,为大量计算能力有限且工作在低带宽、不可靠网络环境中的设备…...

备战蓝桥杯---树形DP基础3
上一次我们讲了二叉苹果树,现在我们加一点难度,从二叉变成了多叉苹果树。 这样子我们就不可以直接按照上次的方法DP,我们其实可以发现,我们可以用类似背包的思想求解,这就是所谓的树上背包。 我们先加进第一个儿子来…...

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知
一、背景 兔年末投了一篇TIE,手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知,获得了许多点赞和收藏。最近也收到了审稿结果,给的意见是大修major revision,总之只要不…...
c#委托的三种实现方式
委托是实质一个类,主要目的是将方法当作参数进行传递。 委托是.NET编程的精髓之一,在日常编程中经常用到,在C#中实现委托主要有Func、Action、delegate三种方式,本节主要就这三种委托的用法通过实例展开讲解。 Func用法解析 【F…...
c/c++|红黑树|分析应用|锚点
红黑树是一种自平衡的二叉查找树,它保持着良好的平衡,能够在插入和删除等操作后通过一系列旋转和重新着色操作来保持树的平衡。这种平衡性质使得红黑树在搜索、插入和删除等操作的平均和最坏情况下的时间复杂度都是O(log n)。以下是红黑树的一些关键特性…...
2-29算法习题总结
贪心问题 小A的糖果 题目描述 小 A 有 n n n 个糖果盒,第 i i i 个盒中有 a i a_i ai 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 x x x,至少得吃掉几颗糖…...
当Linux 磁盘满了,查看大文件并删除
当你的Linux磁盘空间满了时,可以通过以下步骤查找大文件并删除它们: 检查磁盘空间: 使用以下命令检查磁盘空间的使用情况: df -h这将显示文件系统的使用情况,包括每个文件系统的总大小、已用空间、可用空间和挂载点。 …...
STL -萃取特性迭代器
1. STL简单概述 a. STL六大组成部分 容器(Container)空间配置器(allocator)算法(Algorithm)迭代器(Iterator)仿函数(Function object)适配器(Ad…...
python pandas写入csv
在Python的Pandas库中,可以使用to_csv方法将DataFrame对象写入CSV文件。以下是一个简单的示例: import pandas as pd# 创建一个DataFrame对象 data {Name: [Alice, Bob, Charlie, David],Age: [25, 30, 35, 40],City: [New York, Los Angeles, Chicago…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...