QSharedMemory共享內存實現進程間通訊(IPC)及禁止程序多開


博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 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. 范例

偷個懶,寫到一起了:

  1. #include <QCoreApplication>
  2. #include <QSharedMemory>
  3. #include <QDebug>
  4. int main(int argc, char *argv[]) {
  5. QCoreApplication a(argc, argv);
  6. //創建的同時設置key,也可以setKey
  7. QSharedMemory sm("test_shared");
  8. //如果是第一個使用必須先創建
  9. //其余進程不需要創建直接attach
  10. if(!sm.create(1024))
  11. qDebug()<<"create error";
  12. sm.attach();//綁定內存
  13. //attach會返回bool,可以不用下面方式判斷
  14. if(!sm.isAttached())
  15. qDebug()<<"attach error";
  16. sm.lock();
  17. int *memdata = static_cast<int*>( sm.data() );
  18. *memdata = 1024;
  19. sm.unlock();
  20. //如此偷懶!想要測試多進程把下面拷走建項目
  21. QSharedMemory testsm("test_shared");
  22. testsm.attach();
  23. int *testdata = static_cast<int*>( testsm.data() );
  24. qDebug()<<*testdata;
  25. //使當前進程與內存分離,析構的時候也會自動調用
  26. sm.detach();
  27. return a.exec();
  28. }

testsm析構時會調用detach,可以吧sm.detach();放在QSharedMemory testsm(“test_shared”);? 就會看到出錯了

3. 禁止程序多開

  1. #include <QCoreApplication>
  2. #include <QSharedMemory>
  3. int main(int argc, char *argv[]) {
  4. QCoreApplication a(argc, argv);
  5. //創建的同時設置key,也可以setKey
  6. QSharedMemory sm("test_shared");
  7. if(sm.attach())
  8. return 0;
  9. sm.create(1);
  10. MainWindow w;
  11. w.show();
  12. return a.exec();
  13. }

很簡單的原理,只要有一個開啟成功那就會create一個1大小的空間,后續再開程序就能attach了然后就return了……

轉載請以鏈接形式標明本文標題和地址: Techie亮博客 » QSharedMemory共享內存實現進程間通訊(IPC)及禁止程序多開


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM