//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 <QSharedMemory>
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 <QDebug>
#include <QRadioButton>
#include <QHBoxLayout>
#include <QCheckBox>
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;
}
运行测试,输出效果如下: