qt 共享内存编程,并举例

在Qt中,虽然没有直接提供共享内存的高级封装,但你可以使用操作系统提供的共享内存机制,如POSIX共享内存或System V共享内存,结合Qt的信号与槽机制、QThread等来实现进程间的通信。不过,Qt确实提供了一个QSharedMemory类,它是对底层共享内存API的一个简单封装,使得在Qt应用程序之间共享内存变得更加容易。

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

进程A(写入共享内存)

cppCopy Code

#include <QCoreApplication>

#include <QSharedMemory>

#include <QBuffer>

#include <QDataStream>

#include <QDebug>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    QSharedMemory sharedMemory;

    sharedMemory.setKey("SharedMemoryKey");

    if (!sharedMemory.create(128)) {

        qDebug() << "Unable to create shared memory segment.";

        return -1;

    }

    sharedMemory.lock();

    QBuffer buffer;

    QDataStream out(&buffer);

    out << QString("Hello from Process A!");

    int size = buffer.size();

    if (sharedMemory.attach(QSharedMemory::ReadOnly)) {

        sharedMemory.detach();

    }

    char *to = static_cast<char*>(sharedMemory.data());

    const char *from = buffer.data().constData();

    memcpy(to, from, qMin(sharedMemory.size(), size));

    sharedMemory.unlock();

    return a.exec();

}

进程B(读取共享内存)

cppCopy Code

#include <QCoreApplication>

#include <QSharedMemory>

#include <QBuffer>

#include <QDataStream>

#include <QDebug>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    QSharedMemory sharedMemory;

    sharedMemory.setKey("SharedMemoryKey");

    if (!sharedMemory.attach()) {

        qDebug() << "Unable to attach to shared memory segment.";

        return -1;

    }

    sharedMemory.lock();

    QBuffer buffer;

    QDataStream in(&buffer);

    buffer.setData(static_cast<const char*>(sharedMemory.constData()), sharedMemory.size());

    buffer.open(QBuffer::ReadOnly);

    QString text;

    in >> text;

    qDebug() << "Read from shared memory:" << text;

    sharedMemory.unlock();

    sharedMemory.detach();

    return a.exec();

}

说明

  1. 设置共享内存键‌:在两个进程中,我们使用相同的键("SharedMemoryKey")来访问共享内存段。
  2. 创建与附加‌:在进程A中,我们尝试创建一个大小为128字节的共享内存段。如果创建成功,我们将数据写入其中。在进程B中,我们尝试附加到已存在的共享内存段以读取数据。
  3. 数据读写‌:我们使用QBuffer和QDataStream来序列化和反序列化数据。在进程A中,我们将一个QString写入共享内存。在进程B中,我们从共享内存中读取该QString。
  4. 同步‌:通过sharedMemory.lock()和sharedMemory.unlock()来确保在访问共享内存时的线程安全。
  5. 错误处理‌:在实际应用中,你应该添加更多的错误处理逻辑,比如检查共享内存是否已存在(在创建时),检查共享内存的大小是否足够等。

请注意,这个示例仅用于演示目的,并没有包含完整的错误处理或同步机制。在实际应用中,你可能需要使用信号量、互斥锁或其他同步原语来确保多个进程能够安全地访问共享内存。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值