Qt進程間通信——共享內存

在這裏插入圖片描述

說明

setkey:設置密鑰,密鑰是Qt應用程序用來標識共享內存段的標識符。
create:創建共享內存空間
lock/unlock:加鎖解鎖
attach:將進程與共享內存綁定
isAttached:判斷是否綁定
detach:解除綁定

代碼

#include "widget.h"
#include "ui_widget.h"
#include <QBuffer>
#include <QTextStream>
#include <QtDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_sharedMemory.setKey("mykey");
}

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

void Widget::on_pushButton_write_clicked()
{
    if (m_sharedMemory.isAttached())
    {
        if(!m_sharedMemory.detach())
        {
            ui->label_tips->setText("Unable to detach from shared memory.");
            return;
        }
    }

    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out << ui->lineEdit_write->text();
    int size = buffer.size();

    if(!m_sharedMemory.create(size))
    {
        ui->label_tips->setText("Unable to create shared memory segment." + m_sharedMemory.errorString());
        return;
    }
    m_sharedMemory.lock();
    char *to = (char*)m_sharedMemory.data();
    const char *from = buffer.data().data();
    memcpy(to,from,qMin(m_sharedMemory.size(),size));
    m_sharedMemory.unlock();
}

void Widget::on_pushButton_read_clicked()
{
    if(!m_sharedMemory.isAttached())
    {
        if(!m_sharedMemory.attach())
        {
            ui->label_tips->setText("Unable to attach to shared memory segment.");
            return;
        }
    }

    QBuffer buffer;
    QDataStream in(&buffer);
    QString str;

    m_sharedMemory.lock();
    buffer.setData((char*)m_sharedMemory.constData(),m_sharedMemory.size());
    buffer.open(QBuffer::ReadOnly);
    in >> str;
    m_sharedMemory.unlock();

    m_sharedMemory.detach();
    ui->lineEdit_read->setText(str);
}

源碼下載:https://download.csdn.net/download/sinat_33859977/12367396.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章