Qt/C++进程通信(内存共享方式)

源码地址:https://download.csdn.net/download/qq_35241071/12087301

一、qt实现

1、写入

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_pSharedMemory = new QSharedMemory("mcq123");
}

MainWindow::~MainWindow()
{
    delete ui;
}

//写入
void MainWindow::on_pushButton_clicked()
{
    if(m_pSharedMemory->isAttached())
    {
        if(!m_pSharedMemory->detach())
        {
            ui->textBrowser->append("SharedMemory detach failed!");
            return;
        }
    }

    //结构体 转 QByteArray
    QByteArray array;
    Camera_Control_Stru stru;
    stru.cmdId = Command_Set_Zoom;
    stru.cameraPos = Camera_Top;
    stru.zoomValue = 12;
    array.append((char *)&stru, sizeof(stru));

    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out<<array;

    if(!m_pSharedMemory->create( int(buffer.size()) ) )
    {
        ui->textBrowser->append("SharedMemory created failed!");
        return;
    }

    m_pSharedMemory->lock();
    char *to=(char*)m_pSharedMemory->data();
    const char *from=buffer.data().data();
    memcpy(to, from, qMin(m_pSharedMemory->size(), (int)buffer.size()));
    m_pSharedMemory->unlock();
}

2、读出

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_pSharedMemory = new QSharedMemory("mcq123");
}

MainWindow::~MainWindow()
{
    delete ui;
}

//读出
void MainWindow::on_pushButton_clicked()
{
    if(!m_pSharedMemory->attach())
    {
        ui->textBrowser->append("SharedMemory attach failed!");
        return;
    }

    QBuffer buffer;
    QDataStream in(&buffer);
    QByteArray array;
    
    m_pSharedMemory->lock();
    buffer.setData((char *)m_pSharedMemory->constData(), m_pSharedMemory->size());
    buffer.open(QBuffer::ReadOnly);
    in>>array;
    m_pSharedMemory->unlock();
    m_pSharedMemory->detach();

    //QByteArray 转 结构体
    Camera_Control_Stru *pStru = (Camera_Control_Stru *)array.data();
    ui->textBrowser->append(QString::number(pStru->cmdId));
    ui->textBrowser->append(QString::number(pStru->cameraPos));
    ui->textBrowser->append(QString::number(pStru->zoomValue));
}

二、纯c++实现

#ifndef CSHAREDMEMORY_H
#define CSHAREDMEMORY_H

#include <iostream>
#include <Windows.h>

#define INPUT_SIZE          100   //内存空间的大小
#define MAP_NAME            L"Global\\SampleMap"

//指令id
enum CMD_ENUM{
    Command_Invalid,     //无效指令
    Command_Set_Zoom,    //设置放大倍数
    Command_Update_Zoom  //更新放大倍数
};

//相机位置
enum CAMERA_POS_ENUM{
    Camera_Top,
    Camera_Side
};


//数据结构
struct Camera_Control_Stru{
    int cmdId;      //指令id
    int cameraPos;  //相机位置
    int zoomValue;  //放大倍数
    Camera_Control_Stru()
    {
        memset(this, 0, sizeof (Camera_Control_Stru));
    }
};


class CSharedMemory
{
public:
    CSharedMemory();
    ~CSharedMemory();

    bool write_SharedMemory(Camera_Control_Stru *pStru);
    bool read_SharedMemory(Camera_Control_Stru &stru);

private:
    //共享内存句柄
    HANDLE m_FileMap_Handle;
    LPVOID m_pShareMemory;
    HANDLE m_hMutex;
};

#endif // CSHAREDMEMORY_H

#include "CSharedMemory.h"

CSharedMemory::CSharedMemory()
{
    //创建锁,跨进程使用
    m_hMutex = CreateMutex(nullptr, NULL, L"Mutex_Camera");
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, NULL, L"Mutex_Camera");
    }

    ///1.创建共享内存句柄
    SetLastError(NO_ERROR);
    m_FileMap_Handle = CreateFileMapping(INVALID_HANDLE_VALUE,
                                         nullptr,
                                         PAGE_EXECUTE_READWRITE,
                                         0,
                                         INPUT_SIZE,
                                         MAP_NAME);
    if(GetLastError() == ERROR_ALREADY_EXISTS)
    {
        //打开共享的文件对象
        m_FileMap_Handle = OpenFileMappingW(FILE_MAP_ALL_ACCESS,
                                            NULL,
                                            MAP_NAME);
    }
    ///2.得到共享内存的指针
    m_pShareMemory = MapViewOfFile(m_FileMap_Handle,
                                   FILE_MAP_ALL_ACCESS,
                                   0,
                                   0,
                                   INPUT_SIZE);

}

CSharedMemory::~CSharedMemory()
{
    ///4.解除映射
    if(m_pShareMemory)
    {
        UnmapViewOfFile(m_pShareMemory);
    }

    ///5.关闭句柄
    if(m_FileMap_Handle)
    {
        CloseHandle(m_FileMap_Handle);
        m_FileMap_Handle = nullptr;
    }


}

/*************************************************
 <函数名称>    write_SharedMemory
 <功    能>   写共享内存
 <参数说明>    key:共享内存标识
             pStru:需要写入的结构体指针

 <返 回 值>    是否写入成功

 <函数说明>    无
**************************************************/
bool CSharedMemory::write_SharedMemory(Camera_Control_Stru *pStru)
{
    if(nullptr == m_pShareMemory)
    {
        return false;
    }
    WaitForSingleObject(m_hMutex, INFINITE);
    Camera_Control_Stru *pStruTemp = (Camera_Control_Stru *)m_pShareMemory;
    pStruTemp->cmdId     = pStru->cmdId;
    pStruTemp->cameraPos = pStru->cameraPos;
    pStruTemp->zoomValue = pStru->zoomValue;
    ReleaseMutex(m_hMutex);
    return true;
}


/*************************************************
 <函数名称>    read_SharedMemory
 <功    能>   读共享内存
 <参数说明>    key:共享内存标识
             stru:读到的数据结构体

 <返 回 值>    是否读取成功

 <函数说明>    无
**************************************************/
bool CSharedMemory::read_SharedMemory(Camera_Control_Stru &stru)
{
    if(nullptr == m_pShareMemory)
    {
        return false;
    }
    WaitForSingleObject(m_hMutex, INFINITE);
    stru = *((Camera_Control_Stru *)m_pShareMemory);
    ReleaseMutex(m_hMutex);
    return true;
}

发布了32 篇原创文章 · 获赞 4 · 访问量 3398

猜你喜欢

转载自blog.csdn.net/qq_35241071/article/details/103877650