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

版權聲明:若無來源註明, Techie亮博客文章均爲原創。 轉載請以連接形式標明本文標題和地址:
本文標題:QSharedMemory共享內存實現進程間通信(IPC)及禁止程序多開     本文地址: http://techieliang.com/2017/12/685/

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

  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了……htm

轉載請以連接形式標明本文標題和地址: Techie亮博客 » QSharedMemory共享內存實現進程間通信(IPC)及禁止程序多開
相關文章
相關標籤/搜索