qt 共享内存(QSharedMemory)
——————————————————写入部分——————————————————
(本次程序基于控制台程序)
首先 使用共享内存得召唤一下:
#include <QSharedMemory>
然后 声明QSharedMemory类。并且命名为smem
QSharedMemory smem;
由于共享内存没有访问密钥,则不能找到共享的内存。我们给他设置一下访问密钥
QString key,sharedstring;
设置访问密钥
qDebug() << "Please input the shared memory key:";
cin >> key;
然后 声明缓冲区和数据流。缓冲区用于转换和保存数据(使用之前要引用这两个库)
QBuffer buffer; //缓冲区
QDataStream qdsm(&buffer); //数据流
判断输入访问密钥之后,是否附加到共享内存。如果是,则分离
if(smem.isAttached()) smem.detach(); //判断是否已经连接到共享内存块 如果是的话 就先分离
让用户输入共享的数据
qDebug() << "Please input the string to share:";
cin >> sharedstring;
以可读可写的方式打开缓冲区
buffer.open(QBuffer::ReadWrite); //设置读取模式
把共享的字符串输入到数据流
qdsm << sharedstring; //输入共享字符串到数据流
输入到数据流之后 会影响到缓冲区。缓冲区就会得到数据的大小
int size = buffer.size(); //获得字节大小
让共享内存创建一段内存空间,空间大小为缓冲区数据大小。并且检测是否创建成功
if(!smem.create(size)) //检测共享内存段是否创建成功
{
qDebug() << "Could not create sharing memory";
return a.exec();
}
如果创建成功后。为了让程序做读写操作,不让其他的程序影响。我们就先锁上共享内存
smem.lock(); //锁定共享内存
我们先分别获取创建后共享内存的数据的指针和要共享的字符串的数据的指针
char * to = (char *)smem.data(); //共享内存的数据
const char * from = buffer.data().data(); //被共享内存的数据
利用内存拷贝函数(memcpy),把要共享的数据拷贝到共享数据的空间里。拷贝的数据大小是两者中小的那位。哪位小就是要共享的数据的大小(没有证实)
memcpy(to,from,qMin(smem.size(),size)); //把要共享的内存拷贝到被共享的内存
解锁共享内存空间。使其能够被其他程序访问
smem.unlock(); //把共享内存解锁

——————————————————读取部分——————————————————
照样不误的引用上一部分的头文件……
照常不忘的声明共享内存
QSharedMemory sharemem;
声明共享内存的密钥和读出来的字符串
QString key,readstring;
声明缓冲区
QBuffer buffer;
声明数据流
QDataStream out(&buffer);
让用户输入共享内存的密钥
qDebug() << "Please input the shared memory key:";
cin >> key;
设置共享内存的访问密钥。使其能够找到指定共享内存
sharemem.setKey(key);
找到指定的共享内存后关联此内存 (此处可以理解为:去某人的家要东西)
sharemem.attach();
锁上共享内存。(此处可以理解为:关上门,不允许其他人进来)
sharemem.lock();
用缓冲区得到共享内存关联后得到的数据和数据大小
buffer.setData((char *)sharemem.constData(),sharemem.size());
打开缓冲区进行访问
buffer.open(QBuffer::ReadOnly);
使用数据流从缓冲区获得共享内存的数据,然后输出到字符串中
out >> readstring;
解锁共享内存空间 (此处可以理解为:开门,允许其他人进来)
sharemem.unlock();
与共享内存空间分离 (此处可以理解为:我走了,我从家里出去了)
sharemem.detach();

qt 共享内存(QSharedMemory)的更多相关文章
- qt 共享内存 单例
QT 进程间通信之古老的方法(内存共享) 让QT只运行一个实例 以上两篇文章中分别讲述了QSharedMemory的不同作用,第一篇讲了进程间通信,第二篇讲述了怎么让应用程序只 ...
- Qt之进程间通信(共享内存)
简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- 【Qt】Qt之进程间通信(共享内存)【转】
简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...
- linux后台查看共享内存和消息队列的命令
ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...
- boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)
本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...
- Linux 共享内存详解一
共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...
- PHP进程通信基础——信号量+共享内存通信
PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...
- C++ 共享内存 函数封装
#pragma once #include <string> #include <wtypes.h> #include <map> using namespace ...
随机推荐
- 手势识别官方教程(7)识别缩放手势用ScaleGestureDetector.GestureDetector和ScaleGestureDetector.SimpleOnScaleGestureListener
Use Touch to Perform Scaling As discussed in Detecting Common Gestures, GestureDetector helps you de ...
- 在运行时切换 WinForm 程序的界面语言 ---------多语言设置基础
System.ComponentModel.ComponentResourceManager .ApplyResources 时间:2015-06-17 14:59:06 阅读:473 ...
- 【HDOJ】1097 A hard puzzle
题目和1061非常相似,几乎可以复用. #include <stdio.h> ][]; int main() { int a, b; int i, j; ; i<; ++i) { b ...
- bzoj1103
其实这道题和以前在poj上做过的将树映射到树状数组的题目很像 首先不难想到,将一条边从土路修成公路,只对以这条边连接的孩子结点为根的子树有影响: 于是和之前那道poj的题目很像,后序遍历树,对每个节点 ...
- NOI 2014 感想
NOI2014结束了,我卡线登上了领奖台... 这是我第一次NOI,我觉得我收获了很多东西: 1.考前心态不重要,重要的是实力 真正考试的时候是顾不得想其他事情的 2.测试数据是人出的!不是随机的!不 ...
- 软件介绍(apache lighttpd nginx)
一.软件介绍(apache lighttpd nginx) 1. lighttpd Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点.lighttpd是众多 ...
- MVC中的@Html.DisplayFor等方法如何控制日期的显示格式(转)
http://www.tuicool.com/articles/BNVBR3 在Sql Server2005中,如果将某字段定义成日期 时间 类型DateTime,那么在视图中会默认显示成年月日时分秒 ...
- LVS与其他负载均衡软件的区别
有人在邮件列表问haproxy的作者为何haproxy无论是tcp模式还是http模式,能支撑的并发量都不是太大. Willy回答了这个问题. Exactly. The difference is ...
- 卸载安装失败的sqlserver2008 R2
安装sqlserver2008失败,无法正常卸载. 从 计算机 控制面板 卸载时有如图弹窗 并且在 控制面板 中找不到如图的各种插件. 百般无奈之后,发现下载安装windows install ...
- c pvr转存pvr.ccz格式
pvr.ccz 是把pvr用zlib算法压缩后的图像格式,其优点是可以提升文件读取效率. 大多数情况下我们可以用一些工具来将pvr压缩到pvr.ccz ,下面提供一个c++方法来完成这个过程 int ...