QT 进程通讯--共享内存进行通讯,并且两个进程均可进行修改结构体数据

demo主要完成:

共享内存进行通讯,并且两个进程均可对共享数据区中数据进行修改。共享区是一个结构体。

proA为创建共享内存,要先点击proA中连接,再点击ProB中连接去读取内存。更新按钮均是对共享的结构体进行修改,显示按钮是显示当前结构体中数据。

AB两个工程的共享内存中存放的是一个结构体,AB两个工程均可对共享的结构体数据进行修改,具体代码如下:

proA:

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include 

#include 
#include "usedefine.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connect_btn_clicked();

    void on_update_btn_clicked();

    void on_show_btn_clicked();

private:
    Ui::Widget *ui;
    QSharedMemory m_pSharedMemory;//共享内存
    sharedlg *m_psharedlg;//结构体数据
};

#endif // WIDGET_H

cpp文件

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //m_pSharedMemory = NULL;//共享内存
    setWindowTitle("proA--first connect");
    m_psharedlg = NULL;
    m_pSharedMemory.setKey("LD_SHARED");
}

Widget::~Widget()
{
    //再关闭程序时,释放共享内存
    //如果在释放内存之后,仍然有对共享内存的操作,则会报错
    m_pSharedMemory.detach();
    delete ui;
}

void Widget::on_connect_btn_clicked()
{
    /*
     * 进程A-写

分为下面几步:

检测该进程是否连接到共享内存段,如果连接,则将该进程与共享内存段分离。
从系统足够大的内存中得到一个新的共享内存段。
锁定该共享内存段,以阻止第二个对话框进程访问,将缓冲区中的图片复制进共享内存段。
将共享内存段解锁,然后第二个对话框进程就可以访问了。
*/
    if(m_pSharedMemory.isAttached())
    {
        //将该进程与共享内存分离
        if(!m_pSharedMemory.detach())
        {
            qDebug() << "unable to detach from shared memory" << endl;
        }

    }

    int nsize = sizeof(sharedlg);

    qDebug() << "ok"<aa = 1;
    m_psharedlg->dfei =2;
    m_psharedlg->fDui=3;
    m_psharedlg->nFlag =4;
    m_psharedlg->nnew = 5;
    QMessageBox::information(this, "ok", "proa-connect-ok");
    qDebug() << "ok"<aa = ncl++;
    m_psharedlg->nFlag = ncl++;
    m_psharedlg->dfei = ncl++;

    QMessageBox::information(this,"zi",QString("ar%1,%2,%3,%4,%5").arg(m_psharedlg->aa).arg(m_psharedlg->dfei).arg(m_psharedlg->fDui).arg(m_psharedlg->nFlag).arg(m_psharedlg->nnew));

}

void Widget::on_show_btn_clicked()
{
    if(m_psharedlg == NULL)
    {
        return ;
    }
    QMessageBox::information(this,"proA",QString("ar%1,%2,%3,%4,%5").arg(m_psharedlg->aa).arg(m_psharedlg->dfei).arg(m_psharedlg->fDui).arg(m_psharedlg->nFlag).arg(m_psharedlg->nnew));

}

proB

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include "usedefine.h"
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_show_btn_clicked();

    void on_connect_brn_clicked();

    void on_update_btn_clicked();

private:
    Ui::Widget *ui;
    QSharedMemory m_pSharedMemory;//共享内存对象
    sharedlg *m_psharedlg;//结构体
};

#endif // WIDGET_H

cpp文件

#include "widget.h"
#include "ui_widget.h"
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
     setWindowTitle("proB--read");
     m_psharedlg = NULL;
     m_pSharedMemory.setKey("LD_SHARED");
}

Widget::~Widget()
{
    //再关闭程序时,释放共享内存
    //如果在释放内存之后,仍然有对共享内存的操作,则会报错
    m_pSharedMemory.detach();
    delete ui;
}


//连接
void Widget::on_connect_brn_clicked()
{
    //共享内存与该进程绑定
    if(!m_pSharedMemory.attach(QSharedMemory::ReadWrite))
    {

        qDebug() << "unbale to attach ms" <aa << m_psharedlg->dfei<aa = 100;
    m_psharedlg->dfei =101;
    QMessageBox::information(this,"proB",QString("update-ar%1,%2").arg(m_psharedlg->aa).arg(m_psharedlg->dfei));

}

//显示:显示共享数据区中内容
void Widget::on_show_btn_clicked()
{
    if(m_psharedlg == NULL)
    {
        return ;
    }

    QMessageBox::information(this,"proB",QString("ar%1,%2,%3,%4,%5").arg(m_psharedlg->aa).arg(m_psharedlg->dfei).arg(m_psharedlg->fDui).arg(m_psharedlg->nFlag).arg(m_psharedlg->nnew));


}

usedefine文件

直接粘贴在两个工程中,并添加进工程

#ifndef USEDEFINE_H
#define USEDEFINE_H

struct sharedlg{
    int nFlag;
    float fDui;
    int nnew;
    double dfei;
    float aa;/*
    void sharedlg()
    {
        nFlag = -1;
        fDui = -1;
        nnew = -1;
        dfei = -1;
        aa = -1;
    }*/
};


#endif // USEDEFINE_H

QT 进程通讯--共享内存进行通讯,并且两个进程均可进行修改结构体数据_第1张图片

注意: 在析构函数处,需要对共享内存进行资源释放。 否则下次再运行时会出错

本文的有点在于:

AB两个工程均能对共享数据进行修改,而且修改的是结构体数据

代码下载地址:

QT进程之间使用共享内存进行通讯,并且两个进程均可进行修改结构体数据-互联网文档类资源-CSDN文库https://download.csdn.net/download/u012719076/80986389

可参考文章;:Qt 读写共享内存_Genven_Liang的博客-CSDN博客_qt共享内存https://blog.csdn.net/nanfeibuyi/article/details/108894720?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.2&utm_relevant_index=4 

你可能感兴趣的:(QT,qt,c++,开发语言)