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