qt 共享内存QSharedMemory的简单使用

//sharedownload.cpp
#include "sharedownload.h"

ShareDownload::ShareDownload()
{
    gShareDownload.setKey("YT_DOWNLOAD_CMD");
}

void ShareDownload::Create()
{
    if (!hadShareDownload)
    {
        if (gShareDownload.create(sizeof(int))) //创建共享内存
        {
            hadShareDownload = true;
        }
        else if (gShareDownload.attach()) //关联共享内存
        {
            hadShareDownload = true;
        }
    }
}

void ShareDownload::Attach()
{
    if (!hadShareDownload)
    {
        if (gShareDownload.attach()) //关联共享内存
        {
            hadShareDownload = true;
        }
    }
}

void ShareDownload::Detach()
{
    if (hadShareDownload)
    {
        if (gShareDownload.detach()) //取消关联共享内存
        {
            hadShareDownload = false;
        }
    }
}

bool ShareDownload::Write(int data)
{
    bool ret = false;
    if (hadShareDownload)
    {
        gShareDownload.lock();
        memcpy((int *)gShareDownload.data(), &data, sizeof(int));
        gShareDownload.unlock();

        ret = true;
    }
    return ret;
}

bool ShareDownload::Read(int *data)
{
    bool ret = false;
    if (data)
    {
        if (hadShareDownload)
        {
            gShareDownload.lock();
            memcpy(data, (int *)gShareDownload.constData(), sizeof (int));
//            memset((char *)gShareStandBy.data(), 0, sizeof (int));
            gShareDownload.unlock();

            ret = true;
        }
    }

    return ret;
}
//sharedownload.h
#ifndef SHAREDOWNLOAD_H
#define SHAREDOWNLOAD_H

#include 

class ShareDownload
{
public:
    ShareDownload();
    ~ShareDownload(){}

    void Create();
    void Attach();
    void Detach();
    bool Write(int data);
    bool Read(int *data);
private:
    bool            hadShareDownload = false;
    QSharedMemory   gShareDownload;
};

#endif // SHAREDOWNLOAD_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 

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

    ShareDownload share;
    ShareDownload share1;
    share.Create();//创建共享内存
    share1.Attach();//关联内存

    share.Write(12580);//写数据
    share.Detach();//取消关联内存

    int data = 0;
    share1.Read(&data);//读取数据
    share1.Detach();

    qDebug() << "read : " << data;
}

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

运行测试,输出效果如下:
qt 共享内存QSharedMemory的简单使用_第1张图片

你可能感兴趣的:(Qt,qt)