1 はじめに
QSharedMemory は、共有メモリ セグメントへの複数のスレッドおよびプロセス アクセスを提供します。また、個々のスレッドまたはプロセスが排他的アクセスのためにメモリをロックする方法も提供します。
読み取りまたは書き込みの前に lock() で共有メモリをロックすることを忘れないでください。完了したら、unlock() でロックを解放することを忘れないでください。
QSharedMemory の最後のインスタンスが共有メモリ セグメントから切り離されると、QSharedMemory は共有メモリ セグメントを自動的に破棄し、セグメントへの参照を保持しません。
2. 一般的な方法
void setKey(const QString &key) | プラットフォームに依存しないキー値を設定します。キーが現在のキーと同じ場合、関数は何もせずに戻ります。 |
bool create(int サイズ、AccessMode モード = ReadWrite) | 共有メモリ セグメントを作成し、キーをコンストラクタに渡します。 |
bool attach(AccessMode モード = ReadWrite) | キーで識別される共有メモリ セグメントにプロセスをアタッチします。 |
ブールデタッチ() | 共有メモリ セグメントからプロセスを切り離します。 |
ブールロック() | このプロセスによるアクセスのために共有メモリ セグメントをロックする |
ブールロック解除() | 共有メモリ セグメントのロックを解放します |
3. 例
ここでは、読み取り用と書き込み用の 2 つのプロセスが記述されています。
プロセスのソース コードを記述します。
#include "WSharedMemory.h"
#include "ui_WSharedMemory.h"
#include <QDebug>
WSharedMemory::WSharedMemory(QWidget *parent) :
QWidget(parent),
ui(new Ui::WSharedMemory)
{
ui->setupUi(this);
m_sharedMemory = new QSharedMemory(this);
}
WSharedMemory::~WSharedMemory()
{
delete ui;
}
void WSharedMemory::on_btnWrite_clicked()
{
//设置key
m_sharedMemory->setKey("key");
if(m_sharedMemory->isAttached())
{
m_sharedMemory->detach();
}
//创建共享内存端 大小100
if(!m_sharedMemory->create(100, QSharedMemory::ReadWrite))
{
qDebug() << "创建共享内存失败: " << m_sharedMemory->errorString();
return;
}
//写的时候先lock
m_sharedMemory->lock();
char* str = (char *)m_sharedMemory->data();
QByteArray byte = ui->textEdit->toPlainText().toUtf8();
//写入数据
memcpy(str, byte.data(),byte.size());
//写完后解锁
m_sharedMemory->unlock();
}
プロセスのソース コードを読む:
#include "WSharedMemory.h"
#include "ui_WSharedMemory.h"
#include <QDebug>
WSharedMemory::WSharedMemory(QWidget *parent) :
QWidget(parent),
ui(new Ui::WSharedMemory)
{
ui->setupUi(this);
m_sharedMemory = new QSharedMemory(this);
}
WSharedMemory::~WSharedMemory()
{
delete ui;
}
void WSharedMemory::on_btnRead_clicked()
{
//设置访问标识
m_sharedMemory->setKey("key");
if(!m_sharedMemory->attach())
{
qDebug() << "attach error";
}
//读数据前先lock
m_sharedMemory->lock();
char* str = (char *)m_sharedMemory->data();
char* out = new char[m_sharedMemory->size()];
//读取数据到out中
memcpy(out, str, m_sharedMemory->size());
//显示到界面上
ui->textEdit->append(QString(out));
//读取完后unlock
m_sharedMemory->unlock();
//将进程与共享内存段分离
m_sharedMemory->detach();
}