A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 倾心莫若初见 中级黑马   /  2016-10-21 14:45  /  4075 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

·      I. 研究来由
·      II. 注意事项
·      III. 演示代码

I.研究来由
在屏幕共享项目里需要用到共享内存,但是之前对QSharedMemory实在不熟悉,因此在Mac上使用了mmap,而windows系统使用了CreateFileMapping。既然QT提供了跨平台共享内存机制,那么还是研究研究吧。
II.注意事
QSharedMemory虽然是跨平台的进程间内存共享方案,但是在不同的平台也是有不同的行为的,主要的区别是:

  • windows平台下,所有的程退出后,即使crash,共享内存象也会被内核销毁
  • unix平台下,如果有crash致没有用到QSharedMemory的析构函数的,共享内存象不会被内核销毁
以上两句是看QT文档所得,英文水平有限,不一定正确,请验证
setNativeKey这种函数,会导致lock失败,这意味着QT的共享机制被破坏了,所以还是不用了吧。
III.演示代
#include<QApplication>
#include<QSharedMemory>
#include<QDebug>
intmain(int argc, char* argv[])
{
    QApplication app(argc, argv);
    // 构造对象
    QSharedMemory mem;
    // 设置一个key,其他进程通过该key来访问共享内存
    mem.setKey("test-key");
    // 创建一块共享内存,如果创建成功,那么create内部会调用attach
    bool ret = mem.create(1024);
    qDebug() << "create"<< ret << mem.error() << mem.errorString();
    if(!ret)
    {
        // 如果创建失败,说明已经有别的进程创建了该key对应的共享内存,那么本进程直接attach,不需要创建/也不能创建
        ret


精华推荐:

3分钟带你读懂C/C++学习路线
为什么来黑马程序员学C/C++? 稳做IT贵族人才!
2016最新C++学习路线图(附完整视频资源)+ 笔记 + 工具 + 面试题总结!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马