Qt 进程间的通信之共享内存

一、函数说明

  • 头文件#include < QSharedMemory >
  • 1、设置共享内存关键字
    void QSharedMemory::setKey(const QString &key)
  • 2、创建大小为size的共享内存段
    bool QSharedMemory::create(int size, AccessMode mode = ReadWrite)
  • 3、将当前进程附加到以关键字为key的共享内存,默认的访问方式为可读可写。
    只有附加的共享内存才能读取其内存数据。
    bool QSharedMemory::attach(AccessMode mode = ReadWrite)
  • 4、锁定/解锁共享内存,用法与常见的锁一样,访问共享内存之前锁定,访问结束后解锁
    bool QSharedMemory::lock()
    bool QSharedMemory::unlock()
  • 5、获取共享内存的内存地址
    void * QSharedMemory::data()
  • 6、判断共享内存的附加状态
    bool QSharedMemory::isAttached() const

二、实现

在这里插入图片描述

三、代码

.h文件

#ifndef SHARE_H
#define SHARE_H

#include <QWidget>
#include <QSharedMemory>

namespace Ui {
class share;
}

class share : public QWidget
{
    Q_OBJECT

public:
    explicit share(QWidget *parent = nullptr);
    ~share();

private slots:
    void on_pushButton_read_clicked();
    void on_pushButton_write_clicked();

private:
    Ui::share *ui;
    QSharedMemory shareMemory;
};

#endif // SHARE_H

.cpp文件

#include "share.h"
#include "ui_share.h"

#include <QBuffer>
#include <QDebug>
share::share(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::share)
{
    ui->setupUi(this);
    ui->lineEdit->setText("sharekey");
    ui->lineEdit_2->setText("sharekey");
    setStyleSheet("QLineEdit{border: 1px solid rgb(233,233,233);"
                  "background-color:rgba(245,243,233,0);}"
                  "QLineEdit:hover{border: 2px solid rgb(233,233,233);"
                  "background-color:rgb(255,255,255);}");
}

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

void share::on_pushButton_write_clicked()
{
    /*一、创建共享内存*/
    
    /*1、设置共享密钥key*/
    shareMemory.setKey(ui->lineEdit->text());
    if(shareMemory.isAttached()) /* 判断该进程是否已经连接到共享内存段 */
        if (!shareMemory.detach())
            ui->textEdit->setText(tr("无法从共享内存中分离"));
    
    /*2、创建大小为size的共享内存段,成功返回true,反之false*/
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);   /* QDataStream从数据流冲去读取buffer数据 */
    out << ui->textEdit->toPlainText();
    int size = buffer.size();
    if(!shareMemory.create(size)){ /* 自动将该内存段连接到本进程上 */
        ui->textEdit->setText(tr("无法创建共享内存段!"));
        return;
    }
    /*3、写入共享内存*/
    shareMemory.lock();/*锁定共享内存*/
    char *to = (char *)shareMemory.data(); /* 强制转换一个地址 */
    const char *from=buffer.data().data();
    memcpy(to,from,qMin(shareMemory.size(),size));
    shareMemory.unlock();/*解锁共享内存*/
}

void share::on_pushButton_read_clicked()
{
    /*二、访问共享内存*/
    
    /*1、设置共享密钥key*/
    shareMemory.setKey(ui->lineEdit_2->text());
    if(!shareMemory.attach()){
        ui->textBrowser_2->setText(tr("无法连接到共享内存段!"));}
    /*2、访问共享内存*/
    shareMemory.lock();
    QBuffer buffer;
    QDataStream in(&buffer);
    QString str;
    buffer.setData((char*)shareMemory.constData(), shareMemory.size());
    buffer.open(QBuffer::ReadOnly);
    in >> str;
    shareMemory.unlock();
    /*共享内存段由系统释放,即内容被销毁。*/
    shareMemory.detach();

    ui->textBrowser_2->setText(str);
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值