QSharedMemory使用详解

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

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

二、常用方法

    构造函数:

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

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

    创建共享内存:

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

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

    附加到现有共享内存:

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

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

    分离共享内存:

    bool detach();
        1

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

    写入数据:

    void *data();
        1

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

    检查是否已附加:

    bool isAttached() const;
        1

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

    获取错误信息:

    QString errorString() const;
        1

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

三、示例代码

下面是一个简单的示例,演示如何使用 QSharedMemory 在两个进程之间共享数据。
3.1 进程 A:创建和写入共享内存

#include <QCoreApplication>
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>

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 <QCoreApplication>
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>

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();
}

 

四、注意事项

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

总结

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

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
   **********************************感谢博主*******************************************                            
原文链接:https://blog.csdn.net/arv002/article/details/139710671

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值