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
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class QSharedMemory;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void btnClicked();private:Ui::Widget *ui;QSharedMemory *m_sharedMemory;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QBuffer>
#include <QDataStream>
#include <QImage>
#include <QPixmap>
#include <QSharedMemory>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));m_sharedMemory=new QSharedMemory("169254");
}Widget::~Widget()
{delete ui;
}void Widget::btnClicked(){if(!m_sharedMemory->attach()){qDebug()<<"SharedMemory attach failed!";return;}QBuffer buffer;QDataStream in(&buffer);QImage image;m_sharedMemory->lock();buffer.setData((char *)m_sharedMemory->constData(),m_sharedMemory->size());buffer.open(QBuffer::ReadOnly);in>>image;m_sharedMemory->unlock();m_sharedMemory->detach();ui->label->setPixmap(QPixmap::fromImage(image));}
分析端:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class QSharedMemory;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void btnClicked();private:Ui::Widget *ui;QSharedMemory *m_sharedMemory;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"#include <QBuffer>
#include <QFileDialog>
#include <QDataStream>
#include <QSharedMemory>
#include <QDebug>
#include <QPixmap>
#include <QImage>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));m_sharedMemory=new QSharedMemory("169254");
}Widget::~Widget()
{delete ui;
}void Widget::btnClicked()
{if(m_sharedMemory->isAttached()){if(!m_sharedMemory->detach()){qDebug()<<"sharedMemory detach falied!";return;}}QString fileName=QFileDialog::getOpenFileName(this,"","","Images(*.*)");QImage image(fileName);ui->label->setPixmap(QPixmap::fromImage(image).scaled(128,128));QBuffer buffer;buffer.open(QBuffer::ReadWrite);QDataStream out(&buffer);out<<image;if(!m_sharedMemory->create(buffer.size())){qDebug()<<m_sharedMemory->errorString()<<" created failed!";return;}m_sharedMemory->lock();char *to=(char*)m_sharedMemory->data();const char *from=buffer.data().data();memcpy(to,from,qMin(m_sharedMemory->size(),(int)buffer.size()));m_sharedMemory->unlock();
}
Qt工作笔记-进程间的通信(通过QSharedMemory)相关推荐
- linux+Qt 下利用D-Bus进行进程间高效通信的三种方式
linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...
- python进程间通信时间开销_python 进程间的通信
python3,进程间的通信 本文来源于python 3.5版本的官方文档 multiprocessing模块为进程间通信提供了两种方法: 1.进程队列queue The Queue class is ...
- Android 使用AIDL实现进程间的通信
在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...
- 进程间的通信——共享内存
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- 使用AIDL实现进程间的通信
在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通 ...
- 第十章 进程间的通信 之 Java/Android多线程开发(二)
文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...
- Linux之本地进程间Socket通信
文章目录 一.Sokcet 二.Sokcet API (一).sockaddr 结构: (二).struct socketaddr_in : (三).Struct socketaddr_un (四). ...
- 【《现代操作系统 第4版》】4、进程间的通信之互斥
买面包问题 假设有两个人A.B要采购面包,首先查看冰箱中是否有面包,如果没有则离开家去超市购买面包,买来后把面包放到冰箱. 假设A.B的日程如下图所示.显然这会导致面包超买,如何保证最多只有一个人去买 ...
- 使用CreateFileMapping来进行进程间的通信和使用信号量来进行同步操作——进程间实现图片传输
使用共享内存+信号量来进行进程间的通信,实现进程间的图片传输 推荐使用opencv3.x版本,因为opencv4.x就不支持IplImage和Mat类型之间的转换, 有两个进程:图片采集端和图片计算端 ...
最新文章
- 童心未泯的 YOLO 之父,小马哥 Joseph Redmon 笑傲 CV 江湖记
- sql语句转linq的一个小工具
- scrollBarStyle- listview滑动条调整
- 重启计算机后桌面顺序是反的,Win10系统为什么重启电脑之后桌面上的图标排列顺序被打乱该如何处理...
- 2018-2019-1 20189210 《LInux内核原理与分析》第四周作业
- Netty-3-服务端接受并打印telnet传递过来的字符串
- C#正则表达式提取HTML中IMG标签中的SRC地址
- CSDN博客搬家到WordPress
- 谈谈JS中的函数节流
- Linux 运维必备的 13 款实用工具,拿好了~
- hustoj Runtime Error (运行错误)的解决方法
- 测试渗透前置知识-行业术语
- SDL2.0超简单入门 100行代码实现播放wav声音文件
- python获取指定区域的像素_如何获得某个区域的像素值?
- 如何创建表以及设计表需要注意什么,oracle五种限制
- python表白玫瑰花绘制——情人节表白(亲测)
- java doc转图片_使用Java实现word文档转图片 在线预览
- 编写函数:笛卡尔坐标系(Append Code)
- MySQL 5.7 服务端 错误码 (机翻)
- 线性模型是否真的能给出一个很好的解释?
热门文章
- 微博营销不可不知的微博六种人
- 电脑广告弹窗多?安利一下:程序员常用 7 款Chrome去广告插件
- 究极探秘!你知道程序员最喜欢做的四件事是什么吗?
- 大数据时代,如何做好数字化精益生产?附26页智慧工厂解决方案
- 《深入体验 飞鸽传书 开发内幕 核心基础》
- 无论如何都是为了测试傻瓜搜索引擎
- C++:听说C++很难学?该怎么学习C++?
- 中介是如何快速炒高房租,并让你入坑的
- python中summary_python summary 1: class
- 实战+练习!用机器学习预测肺癌 | 明晚8点美国西奈山博后免费直播