博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 coologic博客 查閱,網址:www.coologic.cn
如本文記錄地址為 techieliang.com/A/B/C/ 請改為 www.coologic.cn/A/B/C/ 即可查閱
版權聲明:若無來源注明, Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:QSharedMemory共享內存實現進程間通訊(IPC)及禁止程序多開 本文地址: http://techieliang.com/2017/12/685/
1. 介紹
很簡單的庫,直接看幫助文檔:http://doc.qt.io/qt-5/qsharedmemory.html
主要函數:設置key,create向系統申請建立一個內存空間、attach當前進程與內存綁定、detach解除綁定,lock/unlock同步鎖,data/constdata獲取內存指針
創建者流程:setkey,create,attach,lock,data,操作data,unlock,不用的時候detach
訪問者:setkey,attach,lock,data,操作data,unlock,不用的時候detach?? 不需要create了
- 作為創建者應該確定別人也不用了再解綁
- QSharedMemory析構是也會自動detach
- 一個內存空間如果0個attach時會被銷毀,數據就沒了
- 讀寫操作記着lock,注意不要忘了unlock
- 沒有create的key,在調用attach時會返回false,注意這句在禁止程序多開有用
size獲取共享內存大小,error/errorString是錯誤信息,isAttached判斷當前進程是否已經綁定到內存。
2. 范例
偷個懶,寫到一起了:
- #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了……
轉載請以鏈接形式標明本文標題和地址:
Techie亮博客 »
QSharedMemory共享內存實現進程間通訊(IPC)及禁止程序多開