——————————————————写入部分——————————————————
(本次程序基于控制台程序)
首先 使用共享内存得召唤一下:
#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();