zoukankan      html  css  js  c++  java
  • 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)及禁止程序多开
  • 相关阅读:
    DTD和Schema的区别
    在使用Maven中出现的小错误
    struts2 中 paramsPrepareParamsStack 拦截器
    Hibernate的save()和persist()的区别
    Spring学习笔记
    Hello Spring
    Hibernate3 和Hibernate4 在配置文件上的区别
    今日学习-商品数据库查询
    Java中避免表单重复提交
    Java学习笔记
  • 原文地址:https://www.cnblogs.com/techiel/p/8035263.html
Copyright © 2011-2022 走看看