• Qt 进程间的通信(通过QSharedMemory)


    程序运行截图如下:

    分享端分享图片:

     接受端接受图片:

    分享端的逻辑:

    1.创建一个QSharedMemory,并设置一个key值;

    2.查看这个内存是不是被使用,如果被使用就断开;

    3.调用create进行创建;

    4.使用memcpy把要写入的数据放入QSharedMemory中(内部一般会使用互斥锁技术,锁住资源)

    读取端逻辑:

    1.创建一个QSharedMemory,把key值设置为分享端相同的key值;

    2.使用attach连接上这个QSharedMemory;

    3.以读取字节的方式读取QSharedMemory中的数据(内部一般会使用互斥锁技术,锁住资源);

    4.使用detach端口对这个QSharedMemory的连接。

    源码如下:

    接收端:

    widget.h

     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3  
     4 #include <QWidget>
     5  
     6 class QSharedMemory;
     7  
     8 namespace Ui {
     9 class Widget;
    10 }
    11  
    12 class Widget : public QWidget
    13 {
    14     Q_OBJECT
    15  
    16 public:
    17     explicit Widget(QWidget *parent = 0);
    18     ~Widget();
    19  
    20 public slots:
    21     void btnClicked();
    22  
    23 private:
    24     Ui::Widget *ui;
    25  
    26     QSharedMemory *m_sharedMemory;
    27 };
    28  
    29 #endif // WIDGET_H

    main.cpp

     1 #include "widget.h"
     2 #include <QApplication>
     3  
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication a(argc, argv);
     7     Widget w;
     8     w.show();
     9  
    10     return a.exec();
    11 }

    widget.cpp

     1 #include "widget.h"
     2 #include "ui_widget.h"
     3  
     4 #include <QDebug>
     5 #include <QBuffer>
     6 #include <QDataStream>
     7 #include <QImage>
     8 #include <QPixmap>
     9 #include <QSharedMemory>
    10  
    11 Widget::Widget(QWidget *parent) :
    12     QWidget(parent),
    13     ui(new Ui::Widget)
    14 {
    15     ui->setupUi(this);
    16     connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
    17  
    18     m_sharedMemory=new QSharedMemory("169254");
    19 }
    20  
    21 Widget::~Widget()
    22 {
    23     delete ui;
    24 }
    25  
    26 void Widget::btnClicked(){
    27     if(!m_sharedMemory->attach()){
    28         qDebug()<<"SharedMemory attach failed!";
    29         return;
    30     }
    31     QBuffer buffer;
    32     QDataStream in(&buffer);
    33     QImage image;
    34  
    35     m_sharedMemory->lock();
    36     buffer.setData((char *)m_sharedMemory->constData(),m_sharedMemory->size());
    37     buffer.open(QBuffer::ReadOnly);
    38     in>>image;
    39     m_sharedMemory->unlock();
    40     m_sharedMemory->detach();
    41  
    42     ui->label->setPixmap(QPixmap::fromImage(image));
    43  
    44 }

    分析端:

    widget.h

     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3  
     4 #include <QWidget>
     5  
     6 class QSharedMemory;
     7  
     8 namespace Ui {
     9 class Widget;
    10 }
    11  
    12 class Widget : public QWidget
    13 {
    14     Q_OBJECT
    15  
    16 public:
    17     explicit Widget(QWidget *parent = 0);
    18     ~Widget();
    19  
    20 public slots:
    21     void btnClicked();
    22  
    23 private:
    24     Ui::Widget *ui;
    25     QSharedMemory *m_sharedMemory;
    26 };
    27  
    28 #endif // WIDGET_H

    main.cpp

     1 #include "widget.h"
     2 #include <QApplication>
     3  
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication a(argc, argv);
     7     Widget w;
     8     w.show();
     9  
    10     return a.exec();
    11 }

    widget.cpp

     1 #include "widget.h"
     2 #include "ui_widget.h"
     3  
     4 #include <QBuffer>
     5 #include <QFileDialog>
     6 #include <QDataStream>
     7 #include <QSharedMemory>
     8 #include <QDebug>
     9 #include <QPixmap>
    10 #include <QImage>
    11  
    12 Widget::Widget(QWidget *parent) :
    13     QWidget(parent),
    14     ui(new Ui::Widget)
    15 {
    16     ui->setupUi(this);
    17     connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
    18  
    19     m_sharedMemory=new QSharedMemory("169254");
    20 }
    21  
    22 Widget::~Widget()
    23 {
    24     delete ui;
    25 }
    26  
    27 void Widget::btnClicked()
    28 {
    29     if(m_sharedMemory->isAttached()){
    30         if(!m_sharedMemory->detach()){
    31             qDebug()<<"sharedMemory detach falied!";
    32             return;
    33         }
    34     }
    35  
    36     QString fileName=QFileDialog::getOpenFileName(this,"","","Images(*.*)");
    37     QImage image(fileName);
    38     ui->label->setPixmap(QPixmap::fromImage(image).scaled(128,128));
    39  
    40     QBuffer buffer;
    41     buffer.open(QBuffer::ReadWrite);
    42     QDataStream out(&buffer);
    43     out<<image;
    44  
    45     if(!m_sharedMemory->create(buffer.size())){
    46         qDebug()<<m_sharedMemory->errorString()<<" created failed!";
    47         return;
    48     }
    49  
    50     m_sharedMemory->lock();
    51     char *to=(char*)m_sharedMemory->data();
    52     const char *from=buffer.data().data();
    53     memcpy(to,from,qMin(m_sharedMemory->size(),(int)buffer.size()));
    54     m_sharedMemory->unlock();
    55 }
  • 相关阅读:
    基于深度学习的目标检测
    Redmine发送邮件
    用7次比较完成5个元素的排序
    在GEM5模拟器运行时,对Kill命令的使用
    GDB中的backtrace命令
    [译]如何定义python源文件的文件编码
    QEMU ELF_LOAER分析[基于MIPS]
    if语句的数据驱动优化(Java版)
    解决idea中Activiti的bpmn编辑器的中文乱码问题
    最简易的PHP Storm调试模式开启方式
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14704248.html
Copyright © 2020-2023  润新知