码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • QSharedMemory使用详解


    QSharedMemory 是 Qt 提供的一个类,用于在多个进程之间共享内存。它可以让您在不同的进程间传递数据,而无需通过文件或网络来进行传输。下面是 QSharedMemory 的详细用法和相关知识点。

    一、基本概念

    • 共享内存:共享内存是一块可以被多个进程同时访问的内存区域。通过共享内存,不同进程可以直接读写同一块数据,从而实现高效的数据传递。
    • 关键字:每块共享内存都有一个唯一的关键字,用于标识这块内存。

    二、常用方法

    • 构造函数:

      QSharedMemory(const QString &key, QObject *parent = nullptr);
      

      创建一个 QSharedMemory 对象,并指定共享内存的关键字 key。

    • 创建共享内存:

      bool create(int size, QSharedMemory::AccessMode mode = QSharedMemory::ReadWrite);
      

      创建指定大小的共享内存。size 表示内存大小,mode 表示访问模式,默认是读写模式。

    • 附加到现有共享内存:

      bool attach(QSharedMemory::AccessMode mode = QSharedMemory::ReadWrite);
      

      附加到现有的共享内存段。mode 表示访问模式。

    • 分离共享内存:

      bool detach();
      

      分离共享内存段,使得当前进程不再访问这块共享内存。

    • 写入数据:

      void *data();
      

      获取共享内存的指针,通过这个指针可以直接操作共享内存。

    • 检查是否已附加:

      bool isAttached() const;
      

      检查当前对象是否已附加到共享内存段。

    • 获取错误信息:

      QString errorString() const;
      

      获取最近一次操作的错误信息。

    三、示例代码

    下面是一个简单的示例,演示如何使用 QSharedMemory 在两个进程之间共享数据。

    3.1 进程 A:创建和写入共享内存

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QSharedMemory sharedMemory("SharedMemoryExample");
        if (!sharedMemory.create(1024)) {
            qDebug() << "Unable to create shared memory:" << sharedMemory.errorString();
            return -1;
        }
    
        // 写入数据到共享内存
        QByteArray data;
        QBuffer buffer(&data);
        buffer.open(QBuffer::WriteOnly);
        QDataStream out(&buffer);
        out << QString("Hello from process A");
        buffer.close();
    
        sharedMemory.lock();
        char *to = (char*)sharedMemory.data();
        const char *from = data.data();
        memcpy(to, from, qMin(sharedMemory.size(), data.size()));
        sharedMemory.unlock();
    
        qDebug() << "Process A wrote data to shared memory.";
    
        return a.exec();
    }
    

    3.2 进程 B:读取共享内存

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QSharedMemory sharedMemory("SharedMemoryExample");
        if (!sharedMemory.attach()) {
            qDebug() << "Unable to attach to shared memory:" << sharedMemory.errorString();
            return -1;
        }
    
        sharedMemory.lock();
        QBuffer buffer;
        QDataStream in(&buffer);
        QByteArray data((char*)sharedMemory.constData(), sharedMemory.size());
        buffer.setData(data);
        buffer.open(QBuffer::ReadOnly);
        QString message;
        in >> message;
        sharedMemory.unlock();
    
        qDebug() << "Process B read data from shared memory:" << message;
    
        return a.exec();
    }
    

    四、注意事项

    1. 同步:因为多个进程可以同时访问共享内存,所以需要对共享内存进行同步控制。在上面的示例中使用了 lock() 和 unlock() 方法来实现简单的同步。
    2. 大小限制:共享内存的大小是有限制的,具体大小取决于操作系统。创建共享内存时需要合理估计大小。
    3. 错误处理:在使用 QSharedMemory 时,随时检查返回值并处理可能的错误,可以通过 errorString() 获取详细的错误信息。

    总结

    QSharedMemory 是一个高效的进程间通信方式,通过共享内存,多个进程可以共享数据,提高通信效率。在使用时需要注意同步问题和错误处理。通过上述示例,您可以快速掌握 QSharedMemory 的基本用法,并在实际开发中灵活应用。

    其他QT文章
    1. QT开发环境安装以配置。
    2. QT线段画板实战
    3. 半小时玩转QT桌面系统托盘(含托盘消息)
    4. QT入门开发一个时钟
    5. 半小时教你做大转盘游戏(QT篇)
    6. 手把手教你制作【带吸附效果的线段绘制】(QT)
    7. 手把手教你开发-滚动效果号码抽奖(QT)
    8. 100行代码实现贪吃蛇小游戏
    9.C++实现《扫雷》游戏(入门经典)
    10. svg转图片工具开发
    11. Qt网路与通信(获取本机网络信息)
    12. Qt网路与通信(UDP客户与服务)
    13. Qt网络与通信(TCP聊天室)
    14. Qt多线程以及线程池
    15. Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例
    16. 取色器(QT)
    17. MQTT客户端入门开发
    18.QT文件上传带进度条实例(含源码)
    19. Qt音乐播放器开发实例(可毕设含源码)

  • 相关阅读:
    明明的随机数
    Day_17> 动态内存管理
    Spring AOP
    云原生编程挑战赛落幕,阿里云推出云原生领域首本《应用多活技术白皮书》
    教你用晨曦记账本记账,设置多功能打印账目
    AQS之CountDownLatch分析 (八)
    Java并发之volatile关键字内存可见性问题
    Object.defineProperty
    第十九次CCF计算机软件能力认证
    C语言内存函数
  • 原文地址:https://blog.csdn.net/arv002/article/details/139710671
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号