——————————————————写入部分——————————————————

(本次程序基于控制台程序)

首先 使用共享内存得召唤一下:

#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)的更多相关文章

  1. qt 共享内存 单例

        QT 进程间通信之古老的方法(内存共享)     让QT只运行一个实例     以上两篇文章中分别讲述了QSharedMemory的不同作用,第一篇讲了进程间通信,第二篇讲述了怎么让应用程序只 ...

  2. Qt之进程间通信(共享内存)

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  3. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  4. 【Qt】Qt之进程间通信(共享内存)【转】

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  5. linux后台查看共享内存和消息队列的命令

    ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...

  6. boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)

    本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...

  7. Linux 共享内存详解一

    共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...

  8. PHP进程通信基础——信号量+共享内存通信

    PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...

  9. C++ 共享内存 函数封装

    #pragma once #include <string> #include <wtypes.h> #include <map> using namespace ...

随机推荐

  1. 让动画不再僵硬:Facebook Rebound Android动画库介绍

    introduction official site:http://facebook.github.io/reboundgithub : https://github.com/facebook/reb ...

  2. Java SE知识点

    Java概述 Java的运行机制 JDK,JRE,JVM Java开发环境搭建 用记事本编写运行一个Hello World的完整过程 如何在Java中使用注释 使用Eclipse开发Java程序 使用 ...

  3. 普通pc电脑安装苹果系统mac_详细教程(精)附带所有工具下载

    苹果操作系统只允许在苹果电脑上面安装和使用.和Windows不一样,要在PC上安装,需要一系列的模拟和破解.破解安装的过程很繁琐而具有挑战性,以下是安装10A432雪豹的PC安装指南,附带25张图片帮 ...

  4. -_-#【JS 优化】把 JS 放到底部

    一开始为以为Javascript脚本尽量放到页面底部加载,是指所有的JS脚本都要放到底部,后来才发现, 并不完全是这样,这里所指的脚本是指那些在加载过程中要执行的脚本,所以一般的处理办法还是页面头部引 ...

  5. Charles使用问题, iOS7的http代理(http proxy)配置不生效问题

    Charles配合iOS7使用时, 发现iOS7的http代理(http proxy)配置不生效, 代理信息写完后, 系统没有自动保存. 解决方法: 将些wifi忽略, 重新连接, 再配置代理就好了.

  6. wpa_supplicant 和 802.11g WPA 认证的配置

    # cd /etc/init.d# ln -s net.lo net.eth0 默认的接口名是 wlan0,让它开机时自动 up:cp /etc/init.d/net.lo /etc/init.d/n ...

  7. 转:ndk-stack打印崩溃堆栈

            接下来详细说明ndk-stack的使用方法.         第一步:首先获得发生崩溃的共享库.                 如果你是利用ndk-build应用的话,共享库会在$P ...

  8. [CODEVS3299]有序数组合并求第K大问题

    题目描述 Description 给出两个有序数组A和B(从小到大有序),合并两个有序数组后新数组c也有序,询问c数组中第k大的数 假设不计入输入输出复杂度,你能否给出一个O(logN)的方法? 输入 ...

  9. [NOIP1999]拦截导弹

    1999年NOIP全国联赛提高组 题目描述 Description     某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但 ...

  10. 【JS】Beginner3 & 4 & 5 & 6:Maths & Logic & Conditonal & Looping

    1.number operator () * / + - 2.logic make decisions in code compare values to produce a boolean valu ...