版权声明:若无来源注明,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)及禁止程序多开

QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开的更多相关文章

  1. ACE框架 基于共享内存的进程间通讯

    ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...

  2. Android AIDL 进行进程间通讯(IPC)

    编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...

  3. High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载

    小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...

  4. 进程间通讯IPC的几种方式总结

    Linux进程间的通讯 Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同.前者对Unix早期的进程间通信 ...

  5. 服务 远程服务 AIDL 进程间通讯 IPC

    Activity aidl接口文件 package com.bqt.aidlservice;  interface IBinderInterface {     /* 更改文件后缀为[.aidl]去掉 ...

  6. 服务 进程间通讯 IPC AIDL Parcelable 简介

    1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译:  IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...

  7. 服务 远程服务 AIDL 进程间通讯 IPC 深化

    示例 aidl接口文件 package com.bqt.aidlservice.aidl; parcelable Person;  package com.bqt.aidlservice.aidl; ...

  8. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  9. win32进程间通讯--共享内存

    小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...

随机推荐

  1. imshow()不显示灰度图像

    在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算.在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型.如果 ...

  2. Kotlin基础学习笔记(2)

    1.基本数据类型 Kotlin的基本数值类型包括byte,short,int,long,float,double等.字符不属于数值类型,是一个独立的数据类型. 数字类型中不会主动转换.例如,不能给Do ...

  3. 2017-2018-1 《信息安全技术》实验二——Windows口令破解

    2017-2018-1 <信息安全技术>实验二--Windows口令破解 所用工具 系统:能勾起我回忆的Windows 2003 工具:LC5.SuperDic Windows口令破解 口 ...

  4. BZOJ1208_宠物收养所_KEY

    题目传送门 平衡树的题. 因为题目给出条件(其实自己也知道):同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过10000个. 所以只要维护一颗平衡树,它的里面要不全 ...

  5. uber司机 如何提高评分、接单率、成单率?

    接单率/成单率的解释 接单率计算方法为:成功接单的订单数 除以 系统派单的订单数. 成单率计算方法为:成功完成的订单数 除以 系统派单的订单数. 滴滴快车单单2.5倍,注册地址:http://www. ...

  6. Selenium2+python自动化-xpath定位语法

    前言    在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语 ...

  7. Jmeter接口测试(三)接口测试实践

    Jmeter 脚本编写一般分五个步骤: 1. 添加线程组 2. 添加 http 请求 3. 在 http 请求中写入接入 url.路径.请求方式和参数 4. 添加查看结果树 5. 调用接口.查看返回值 ...

  8. 常用SQL语句大全(SQL Server)

    一.基础       查看数据库状态 select state_desc from sys.databases where name='dbname'  -- dbname数据库名 1.说明:创建数据 ...

  9. 3星|《给你讲个笑话:我是创业公司CEO》:创业成功就是上帝掷骰子

    给你讲个笑话:我是创业公司CEO 作者有过数次创业经历,最后一次在济南创业,后来公司搬到北京,看书中的交代公司目前好像还不算太成功.书中交代作者公司的业务是文化产品的策划,没细说做什么,也没说做成过哪 ...

  10. 华为云分布式缓存服务DCS与开源服务差异对比

    华为云分布式缓存DCS提供单机.主备.集群等丰富的实例类型,满足用户高读写性能及快速数据访问的业务诉求.支持丰富的实例管理操作,帮助用户省去运维烦恼.用户可以聚焦于业务逻辑本身,而无需过多考虑部署.监 ...