1. 介绍
很简单的库,直接看帮助文档:http://doc.qt.io/qt-5/qsharedmemory.htmlhtml
主要函数:设置key,create向系统申请创建一个内存空间、attach当前进程与内存绑定、detach解除绑定,lock/unlock同步锁,data/constdata获取内存指针app
建立者流程:setkey,create,attach,lock,data,操做data,unlock,不用的时候detach函数
访问者:setkey,attach,lock,data,操做data,unlock,不用的时候detach?? 不须要create了post
- 做为建立者应该肯定别人也不用了再解绑
- QSharedMemory析构是也会自动detach
- 一个内存空间若是0个attach时会被销毁,数据就没了
- 读写操做记着lock,注意不要忘了unlock
- 没有create的key,在调用attach时会返回false,注意这句在禁止程序多开有用
size获取共享内存大小,error/errorString是错误信息,isAttached判断当前进程是否已经绑定到内存。测试
2. 范例
偷个懒,写到一块儿了:spa
- #include <QCoreApplication>
- #include <QSharedMemory>
- #include <QDebug>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- //建立的同时设置key,也能够setKey
- QSharedMemory sm("test_shared");
- //若是是第一个使用必须先建立
- //其他进程不须要建立直接attach
- if(!sm.create(1024))
- qDebug()<<"create error";
- sm.attach();//绑定内存
- //attach会返回bool,能够不用下面方式判断
- if(!sm.isAttached())
- qDebug()<<"attach error";
- sm.lock();
- int *memdata = static_cast<int*>( sm.data() );
- *memdata = 1024;
- sm.unlock();
- //如此偷懒!想要测试多进程把下面拷走建项目
- QSharedMemory testsm("test_shared");
- testsm.attach();
- int *testdata = static_cast<int*>( testsm.data() );
- qDebug()<<*testdata;
- //使当前进程与内存分离,析构的时候也会自动调用
- sm.detach();
- return a.exec();
- }
testsm析构时会调用detach,能够吧sm.detach();放在QSharedMemory testsm(“test_shared”);? 就会看到出错了指针
3. 禁止程序多开
- #include <QCoreApplication>
- #include <QSharedMemory>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- //建立的同时设置key,也能够setKey
- QSharedMemory sm("test_shared");
- if(sm.attach())
- return 0;
- sm.create(1);
- MainWindow w;
- w.show();
- return a.exec();
- }
很简单的原理,只要有一个开启成功那就会create一个1大小的空间,后续再开程序就能attach了而后就return了……htm