1. Introducción
QSharedMemory proporciona múltiples subprocesos y procesos de acceso a segmentos de memoria compartida. También proporciona una forma para que hilos o procesos individuales bloqueen la memoria para acceso exclusivo.
Recuerde bloquear la memoria compartida con lock() antes de leerla o escribirla, y recuerde liberar el bloqueo con unlock() cuando haya terminado.
Cuando la última instancia de QSharedMemory se desconecta del segmento de memoria compartida, QSharedMemory destruye automáticamente el segmento de memoria compartida y no mantiene una referencia al segmento.
2. Métodos comunes
void setKey(const QString &key) | Establezca el valor de la clave independiente de la plataforma. Si la clave es la misma que la clave actual, la función regresa sin hacer nada. |
bool create (tamaño int, modo AccessMode = ReadWrite) | Cree un segmento de memoria compartida y pase la clave al constructor, |
bool adjuntar (modo AccessMode = ReadWrite) | Adjunte el proceso al segmento de memoria compartida identificado por clave |
bool separar() | Separe un proceso de un segmento de memoria compartida. |
bloqueo bool() | Bloquear el segmento de memoria compartida para el acceso de este proceso |
desbloqueo bool() | libera el bloqueo en el segmento de memoria compartida |
3. Ejemplos
Aquí se escriben dos procesos, uno para leer y otro para escribir.
Escribir el código fuente del proceso:
#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();
}
Leer el código fuente del proceso:
#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();
}