Qt QSharedMemory memoria compartida

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();
}

Supongo que te gusta

Origin blog.csdn.net/wzz953200463/article/details/125666324#comments_26240119
Recomendado
Clasificación