ipv6网站如何做/网络营销广告

ipv6网站如何做,网络营销广告,wordpress导航调用分类,做同城特价的网站1. 什么是 QSharedMemory? QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域,从而避免数据传输时的 IO 操作,提高通信速度。通过共享内存,多个进程可以直接读写这块内存,而无需经过文件…

1. 什么是 QSharedMemory?

QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域,从而避免数据传输时的 IO 操作,提高通信速度。通过共享内存,多个进程可以直接读写这块内存,而无需经过文件或网络传递。

QSharedMemory 的核心特点

  1. 唯一键(Key)标识

    • 每块共享内存通过唯一的键(字符串)标识。

    • 不同进程通过相同的键连接到共享内存。

  2. 线程安全性

    • 提供锁机制(lock() 和 unlock())以保护共享内存的读写。

  3. 跨平台支持

    • Qt 的跨平台特性使 QSharedMemory 可以在不同操作系统上无缝使用。


2. QSharedMemory 的常用场景

  1. 实时数据共享

    • 如传感器数据、实时日志等需要在多个进程间快速传递。

  2. 高性能需求

    • 在频繁更新的大量数据(如图像处理、缓存共享)中,通过共享内存减少通信开销。

  3. 进程间消息传递

    • 两个或多个应用程序之间的简单数据交换。


3. QSharedMemory 的工作流程

共享内存的基本使用可以分为以下几个步骤:

  1. 创建共享内存

    • 第一个进程通过 create(size) 创建一块共享内存。

    • 分配的大小由数据的存储需求决定。

  2. 附加到共享内存

    • 其他进程通过 attach() 方法连接到已有的共享内存。

  3. 数据读写

    • 通过 lock() 和 unlock() 保证线程安全,获取内存指针后读写数据。

  4. 释放共享内存

    • 调用 detach() 断开与共享内存的连接。


4. QSharedMemory 常用函数详解

以下是 QSharedMemory 类的常用函数及其作用:

函数名作用
构造函数

创建 QSharedMemory 对象,指定唯一键标识共享内存。

create(size)

创建指定大小的共享内存,如果共享内存已存在则返回失败。

attach()

附加到已有的共享内存,连接成功后可以访问内存内容。

detach()

断开与共享内存的连接,并释放资源(只有最后一个进程断开时共享内存才会被销毁)。

lock()

锁定共享内存,防止其他进程或线程同时访问数据(用于数据同步)。

unlock()

解锁共享内存,允许其他进程访问数据。

data()

 / constData()

获取共享内存的指针,用于读写数据(data() 为可写指针,constData() 为只读指针)。

isAttached()

检查当前进程是否已经连接到共享内存。

error()

 / errorString()

获取最近一次操作的错误代码和描述,便于调试。


5. 使用示例:QSharedMemory 实现进程间通信

以下是一个完整的例子,展示如何通过 QSharedMemory 实现进程间的读写通信。

程序1:写入共享内存

程序1负责创建共享内存并向其中写入数据。

#include <QCoreApplication>
#include <QSharedMemory>
#include <QDebug>
#include <QTimer>
#include <QDateTime>#define tc(a) QString::fromLocal8Bit(a)int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSharedMemory sharedMemory("MySharedMemoryKey");// 创建共享内存,大小为 1024 字节if (!sharedMemory.create(1024)) {qDebug() << tc("无法创建共享内存:") << sharedMemory.errorString();return-1;}qDebug() << tc("共享内存已创建");// 定时写入动态数据QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() {if (sharedMemory.lock()) {char *to = static_cast<char *>(sharedMemory.data());QString message = tc("程序1动态消息#") + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");QByteArray byteArray = message.toLocal8Bit();memcpy(to, byteArray.data(), byteArray.size() + 1); // 写入动态数据sharedMemory.unlock();qDebug() << tc("成功写入共享内存:") << message;} else {qDebug() << tc("无法锁定共享内存进行写入:") << sharedMemory.errorString();}});timer.start(1000); // 每秒更新一次return a.exec();
}

程序2:读取共享内存

程序2连接到共享内存,读取数据并解析时间戳。

#include <QCoreApplication>
#include <QSharedMemory>
#include <QDebug>
#include <QTimer>
#include <QDateTime>#define tc(a) QString::fromLocal8Bit(a)int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSharedMemory sharedMemory("MySharedMemoryKey");// 连接到已有的共享内存if (!sharedMemory.attach()) {qDebug() << tc("无法连接到共享内存:") << sharedMemory.errorString();return-1;}qDebug() << tc("成功连接到共享内存");// 定时读取数据QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() {if (sharedMemory.lock()) {constchar *from = static_cast<constchar *>(sharedMemory.constData());QString data = QString::fromLocal8Bit(from);sharedMemory.unlock();// 解析时间戳QString timeStampString = data.split("#").at(1);QDateTime messageTime = QDateTime::fromString(timeStampString, "yyyy-MM-dd hh:mm:ss.zzz");// 当前时间QDateTime currentTime = QDateTime::currentDateTime();qDebug() << tc("从共享内存读取到的数据:") << data;// 如果时间戳解析成功,计算时间差if (messageTime.isValid()) {qint64 timeDifference = messageTime.msecsTo(currentTime); // 时间差(毫秒)qDebug() << tc("接收到的时间:") << messageTime.toString("yyyy-MM-dd hh:mm:ss.zzz");qDebug() << tc("当前时间:") << currentTime.toString("yyyy-MM-dd hh:mm:ss.zzz");qDebug() << tc("时间差(毫秒):") << timeDifference;} else {qDebug() << tc("无法解析时间戳!");}} else {qDebug() << tc("无法锁定共享内存进行读取:") << sharedMemory.errorString();}});timer.start(1000); // 每秒读取一次return a.exec();
}


6. 注意事项

  1. 共享内存大小

    • 创建共享内存时,指定的大小必须足够大以存储所有数据。

  2. 锁机制

    • 在操作共享内存前,必须调用 lock() 进行锁定,以避免数据竞争。

    • 使用完成后,必须调用 unlock() 解锁。

  3. 错误处理

    • 使用 error() 和 errorString() 检查共享内存的状态。

  4. 进程退出

    • 调用 detach() 确保释放共享内存资源。


7. 总结

QSharedMemory 是一种高效的进程间通信方式,适用于需要快速传递数据的场景。通过本文的讲解,您应该能够掌握 QSharedMemory 的核心功能及其应用。无论是共享日志、实时数据,还是跨进程消息传递,QSharedMemory 都是一个值得考虑的解决方案。

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

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

相关文章

2024年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析&#xff1a; A. 矩阵是非线性结构 错误。矩阵通常是二维数组&#xff0c;属…

基于Ebay拍卖网站成交价格的影响因素分析

摘要:近些年来网上拍卖的不断地发展&#xff0c;网上购物慢慢变成了大家普遍接受的购物方式。因此关于网上拍卖的研究日益成为很多人研究的重点。 影响拍卖网站价格的因素很多&#xff0c;但很少有人分得清楚哪些因素才是比较重要的因素&#xff0c;因此对价格因素分析&#x…

Langchain中的表格解析:RAG 和表格的爱恨情仇

实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

原生后台GPS位置限制,降低功耗

1.后台 GPS 位置限制的背景 为了控制功耗&#xff0c;Android 平台对后台应用获取位置信息的频率进行了限制。后台的定义与后台执行限制一致&#xff0c;即应用不在前台运行时被视为后台应用。 2.更新间隔限制&#xff1a; 后台应用获取位置信息的更新间隔不能超过一定阈值。…

Docker 搭建 PlantUML 服务:高效生成 UML 图的最佳实践

PlantUML 是一款开源的 UML 图形生成工具&#xff0c;它支持生成类图、时序图、用例图、活动图等多种类型的 UML 图&#xff0c;广泛应用于软件设计、文档编写以及团队沟通中。通过 Docker 安装 PlantUML&#xff0c;开发者可以快速搭建环境&#xff0c;轻松生成 UML 图&#x…

简鹿办公汇总快速打开 Windows 资源管理器的几种方式

无论你是刚开始使用电脑的新手&#xff0c;还是已经有一定经验的用户&#xff0c;了解如何在 Windows 系统中打开资源管理器都是一个非常基本且重要的技能。Windows 资源管理器&#xff08;现在称为“文件资源管理器”&#xff09;是帮助你浏览、查找和管理计算机上所有文件的主…

DNA-PAINT

参考: 【科研教程】NUPACK网页版使用教程 https://www.bilibili.com/video/BV1G94y1W7mN/NUPACK新版网页版教程-模拟部分 https://zhuanlan.zhihu.com/p/678730568NUPACK 4.0 User Guide https://docs.nupack.org/NUPACK网页版使用指南 https://zhuanlan.zhihu.com/p/55024017…

小程序内表格合并功能实现—行合并

功能介绍&#xff1a;支付宝小程序手写表格实现行内合并&#xff0c;依据动态数据自动计算每次需求合并的值&#xff0c;本次记录行内合并&#xff0c;如果列内合并&#xff0c;同理即可实现 前端技术&#xff1a;grid布局 display&#xff1a;grid 先看实现效果: axml&…

计算机视觉cv2入门之角点检测

角点是指图像中两条边缘线的交点&#xff0c;这些交点通常代表了图像中的重要特征。在计算机视觉中&#xff0c;角点检测是一种关键的技术&#xff0c;它可以帮助我们从图像中提取出这些重要的特征点&#xff0c;进而用于图像匹配、物体识别、图像拼接等多种应用。 角点检测示例…

抽奖的诱惑系统注册与登录功能测试报告

目录 一&#xff1a;项目背景 二&#xff1a;项目功能 &#xff08;1&#xff09; 注册功能 &#xff08;2&#xff09; 登录功能 电话 密码登录 电话 短信登录 三&#xff1a;设计测试用例 四&#xff1a;功能测试 五&#xff1a;自动化测试代码 七&#xff1a;遗留风…

【蓝桥杯】每日练习 Day12 贡献法

前言 今天给大家带来两道贡献法的问题&#xff0c;先来讲一下什么是贡献法。 贡献法&#xff0c;与其说是一种算法&#xff0c;不如说是一种数学方法&#xff0c;是一种思维方式。 先来给大家举个例子&#xff0c;假设现在有个问题&#xff0c;需要你在一个只有小写字母的字…

文字也能生成视频?【蓝耘实践】:通义万相2.1文生视频

文字也能生成视频&#xff1f;【蓝耘实践】&#xff1a;通义万相2.1文生视频 上次我们已经介绍了关于在蓝耘云平台实践通义万相的基本玩法&#xff0c;这次将介绍进阶玩法&#xff0c;也就是使用文字来生成视频。 首先我们还是先注册或者登录蓝耘云平台。 通过蓝耘平台进入流…

ASP.NET Web的 Razor Pages应用,配置热重载,解决.NET Core MVC 页面在更改后不刷新

Razor Pages应用&#xff0c;修改页面查看修改效果&#xff0c;如果没有热重载&#xff0c;改一句话跑一次&#xff0c;这个活就没法干了。 1、VS2022中的NuGet中安装RuntimeCompilation Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 需要配套你的.net sdk版本&#x…

PhotoShop学习02

1.添加文本 这个工具栏是文字工具栏&#xff0c;快捷键是T。选择之后鼠标会变成一个竖杠外貌&#xff0c;我们可以借此在图片中写入文字。 选择后&#xff0c;上方的工具栏会变为专门调整文字工具 这个框点击旁边的小箭头可以选择我们我们电脑系统自带的字体&#xff0c;同时可…

BFS解决FloodFill算法

1.图像渲染 733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 1.题目解析 有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sc 和 color 。你应该从像素 image[sr][sc] 开始对图像进行…

OpenAI的“噩梦”,DeepSeek V3-0324效率革命展现中国AI雄心

3月24日晚&#xff0c;DeepSeek低调发布其V3模型的小版本更新——DeepSeek V3-0324&#xff0c;这一操作立即在社区引发热议。据悉&#xff0c;该版本已集成至DeepSeek官网、应用程序和小程序&#xff0c;用户只需关闭“Deep Thinking”功能即可体验。另该模型已在Hugging Face…

mysql创建库表插入数据演示

show databases; use zzj; create table stu (sid int primary key,name varchar(10) not null,sex varchar(2) );desc stu;insert into stu (sid, name, sex) values (1, zzj, 男);select * from stu; desc stu: select * from stu:

用SVG绕过浏览器XSS审计

[Translated From]&#xff1a;http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html SVG - <use> element SVG中的<use>元素用于重用其他元素&#xff0c;主要用于联接<defs>和alike&#xff0c;而我们却用它来引用外部SVG文件…

简记_单片机硬件最小系统设计

以STM32为例&#xff1a; 一、电源 1.1、数字电源 IO电源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦电容1 x 10u N x 100n &#xff1b; 内核电源&#xff1a;内嵌的稳压器输出&#xff1a;1.2V&#xff0c;给内核、存储器、数字外设…