qt-QSharedMemory的使用

QSharedMemory简介:

QSharedMemory时跨平台的共享内存类,提供了访问操作系统共享内存的实现。它允许多个线程和进程安全地访问共享内存段。
演示代码:

//MainWindow.h
#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_loadimg_clicked();

    void on_showimg_clicked();
    void detach();

private:
    Ui::MainWindow *ui;
    QSharedMemory sharedMemory; //创建共享内存对象
};
//mainWindowd.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sharedMemory.setKey("sharedMemoryDemo"); //为共享内存设置唯一标识
}

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

//将图片数据加载共享内存
void MainWindow::on_loadimg_clicked()
{
    if(sharedMemory.isAttached()){ //判断是否有进程连接着共享内存
        detach(); //有的话就分离该进程
    }

    //打开一个图片
    QString fileName = QFileDialog::getOpenFileName(this,
     					tr("please choose a image"),
     					 "/home",
      					tr("Images (*.png *.jpeg *.jpg)"));

    QImage image;
    if(!image.load(fileName)){ //将图片加载到image
        ui->label->setText("请选择图片文件");
        return;
    }
    QBuffer buffer;
    QDataStream out(&buffer);//创建buffer的管道
    buffer.open(QBuffer::ReadWrite);//以读写的方式打开
    out << image; //将image数据写入到缓冲区buffer

    //创建共享内存
    if(!sharedMemory.create(buffer.size())){
        ui->label->setText("创建共享内存失败");
        return;
    }

    //将图片数据复制到共享内存
    //操作内存时,需要加锁,防止其他进程操作
    sharedMemory.lock();
    char* to = (char*)sharedMemory.data();
    const char* from = buffer.data();
    std::memcpy(to,from,qMin(sharedMemory.size(),buffer.size())); //普通的memcpy操作
    //操作完毕需要解锁
    sharedMemory.unlock();
}

//从共享内存中取出图片并显示
void MainWindow::on_showimg_clicked()
{
    //将该进程关联到共享内存
    if(!sharedMemory.attach()){
        ui->label->setText("无法连接到共享内存");
    }

    //从共享内存中读取图片数据到buffer中
    QBuffer buffer;
    QDataStream in(&buffer);
    QImage image;
    //操作共享内存加锁
    sharedMemory.lock();
    buffer.setData((char*)sharedMemory.constData(),sharedMemory.size()); //将共享内存的数据加载到缓冲区buffer中
    buffer.open(QBuffer::ReadOnly);//只读方式打开buffer
    in >> image; //从buffer中读取数据到image
    sharedMemory.unlock();
    sharedMemory.detach();//使用完毕就分离该进程
    //显示图片
    ui->label->setPixmap(QPixmap::fromImage(image));
}

void MainWindow::detach() //分离操作
{
    if(!sharedMemory.detach()){
        ui->label->setText("无法分离该进程");
        return;
    }
}


演示效果如下:

你可能感兴趣的:(Qt与QML,qt5)