一、函数说明
- 头文件#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);
}