Qt内存共享(跨线程进程交互)

demo

写入

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //"memory"是共享内存块的键值(标识),所以必须一致
    share=new QSharedMemory("memory");
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_spinBox_valueChanged(int arg1)
{
     QString dataStr=QString::number(arg1);
    int size = dataStr.size();
    //create用法类似new,用来开辟内存空间
    share->create(size,QSharedMemory::ReadWrite);

    //lock/unlock用法类似线程锁,用来确保数据正确性
    share->lock();

    char*dataShare= (char*)share->data();
    memcpy(dataShare,dataStr.toStdString().c_str(),size);

    share->unlock();
}

读取

#include <string>
using namespace std;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_Timer=new QTimer;
    m_Timer->start(10);
    connect(m_Timer,SIGNAL(timeout()),this,SLOT(slot_QTimer_TimeOut()));

    //"memory"是共享内存块的键值(标识),所以必须一致
    share=new QSharedMemory("memory");

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slot_QTimer_TimeOut()
{
    if(!share->attach(QSharedMemory::ReadOnly)){ return;}

    share->lock();
    char*c=(char*)share->constData();

    string str = c;
    QString qstr = QString::fromStdString(str);
    ui->lineEdit->setText(qstr);

    //detach类似于delete,如果写入完成就直接detach,读取端就会attach失败
    share->detach();
    share->unlock();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Qt 共享内存进程传递的例子: sender.cpp: ```cpp #include <QCoreApplication> #include <QSharedMemory> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建共享内存 QSharedMemory sharedMemory; sharedMemory.setKey("testSharedMemory"); if (!sharedMemory.create(sizeof(int))) { qDebug() << "Failed to create shared memory"; return -1; } // 写入数据共享内存 int value = 123; memcpy(sharedMemory.data(), &value, sizeof(int)); qDebug() << "Write value to shared memory:" << value; // 发送信号 sharedMemory.attach(); sharedMemory.lock(); sharedMemory.unlock(); sharedMemory.detach(); return a.exec(); } ``` receiver.cpp: ```cpp #include <QCoreApplication> #include <QSharedMemory> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 获取共享内存 QSharedMemory sharedMemory; sharedMemory.setKey("testSharedMemory"); if (!sharedMemory.attach()) { qDebug() << "Failed to attach shared memory"; return -1; } // 读取共享内存中的数据 int value; memcpy(&value, sharedMemory.data(), sizeof(int)); qDebug() << "Read value from shared memory:" << value; // 删除共享内存 sharedMemory.detach(); sharedMemory.setKey("testSharedMemory"); sharedMemory.attach(); sharedMemory.lock(); sharedMemory.unlock(); sharedMemory.detach(); sharedMemory.remove(); return a.exec(); } ``` 在 sender.cpp 中,我们创建一个大小为 sizeof(int) 的共享内存,并将数据 123 写入其中。然后发送一个信号通知 receiver.cpp 从共享内存中读取数据。 在 receiver.cpp 中,我们获取共享内存并读取其中的数据。最后删除共享内存

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值