Qt实现进程间通信
更新时间:2022年8月19日 17:01 点击:462 作者:MechMaster
本文实例为大家分享了Qt实现进程间通信的具体代码,供大家参考,具体内容如下
1. 进程间通信的方法
1.TCP/IP
Qt Network提供了众多的类来实现网络编程。
2.共享内存
QSharedMemory是跨平台的共享内存类,提供了访问操作系统共享内存的实现。它允许多个线程和进程安全地访问共享内存片段。此外,QSystemSemaphore可用于控制系统的共享资源的访问以及进程间通信。
3.D-Bus
D-Bus模块是一个Unix库,可以使用D-Bus协议来实现进程间通信。它将Qt的信号和槽机制扩展到了IPC层面,允许一个进程发射的信号关联到另一个进程的槽上。
4.QProcess
5.会话管理
在Linux/X11平台上,Qt提供了对会话管理的支持,回话允许时间传播到进程。例如,当关机时通知进程或程序,从而可以执行一些相关的操作。
2. 不同进程间共享内存示例代码
dialog.h
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QSharedMemory> namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; QSharedMemory sharedMemory; void detach(); public slots: void loadFromFile(); void loadFromMemory(); private slots: void on_pushButtonLoadFromFile_clicked(); void on_pushButtonLoadFromSharedMemory_clicked(); }; #endif // DIALOG_H
dialog.cpp
#include "dialog.h" #include "ui_dialog.h" #include <QFileDialog> #include <QBuffer> #include <QDebug> Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); //在共享内存以前,需要先为其制定一个key,系统用它来作为底层共享内存段的标识。这个key可以是任意的字符串 sharedMemory.setKey("QSharedMemoryExample"); } Dialog::~Dialog() { delete ui; } void Dialog::loadFromFile() { //判断该进程是否已经连接到共享内存段,如果是,就将该进程与共享内存段进行分离。 if(sharedMemory.isAttached()) detach(); ui->label->setText(tr("选择一个图片文件!")); QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),tr("Images(*.png *.jpg)")); QImage image; if(!image.load(fileName)) { ui->label->setText(tr("选择的文件不是图片,请选择图片文件")); return; } ui->label->setPixmap((QPixmap::fromImage(image))); //将图片加载到共享内存 QBuffer buffer; //将图片暂存到buffer中 buffer.open(QBuffer::ReadWrite); //获取图片数据的指针 QDataStream out(&buffer); out<<image; //获取图片的大小 int size = buffer.size(); //创建指定大小的共享内存段 if(!sharedMemory.create(size)) { ui->label->setText(tr("无法创建共享内存段"));// return; } //在共享内存段的操作时,需要先加锁 sharedMemory.lock(); char * to = (char*)sharedMemory.data(); const char * from = buffer.data().data(); memcpy(to,from,qMin(sharedMemory.size(),size)); //解锁 sharedMemory.unlock(); //如果将最后一个连接在共享内存段上的进程进行分离,那么系统会释放共享内存段。 } void Dialog::loadFromMemory() { //将进程连接到共享内存段 if(!sharedMemory.attach()) { ui->label->setText(tr("无法连接到共享内存段,\n" "请先加载一张图片!")); return; } QBuffer buffer; QDataStream in(&buffer); QImage image; sharedMemory.lock(); //读取内存段中的数据 buffer.setData((char*)sharedMemory.constData(),sharedMemory.size()); buffer.open(QBuffer::ReadOnly); in>>image; sharedMemory.unlock(); sharedMemory.detach(); ui->label->setPixmap(QPixmap::fromImage(image)); } void Dialog::detach() { if(!sharedMemory.detach()) { ui->label->setText(tr("无法从共享内存中分离")); } } void Dialog::on_pushButtonLoadFromFile_clicked() { loadFromFile(); } void Dialog::on_pushButtonLoadFromSharedMemory_clicked() { loadFromMemory(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
原文出处:https://blog.csdn.net/weixin_38566632/article/details/124336
上一篇: C++中 Sort函数详细解析
下一篇: Qt实现简单的TCP通信
相关文章
- 这篇文章主要介绍了C#启动进程的几种常用方法,实例分析了C#对系统进行的相关操作技巧,需要的朋友可以参考下...2020-06-25
- 在本篇文章里小编给大家分享了关于C#获取所有进程的方法和步骤,有需要的朋友们跟着学习参考下。...2020-06-25
- 这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧...2020-06-25
- 下面小编就为大家分享一篇Qt 使用Poppler实现pdf阅读器的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了将matplotlib绘图嵌入pyqt的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-27
- C#获取进程的主窗口句柄的实现方法,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了C#使用SendMessage实现进程间通信的方法,涉及C#中SendMessage方法的使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#中进程的挂起与恢复操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Windows中C#启动外部程序进程的方法,例子中同时包括了进程关闭的方法,需要的朋友可以参考下...2020-06-25
- 线程通信相信大家都不陌生了,但是你知道几种方法呢,本文主要介绍了android实现线程间通信的四种常见方式,分享给大家,需要的朋友们下面随着小编来一起学习学习吧...2021-05-13
- 这篇文章主要介绍了vue组件之间的通信,帮助大家更好的理解和学习前端的相关知识,感兴趣的朋友可以了解下...2020-08-30
- 本篇文章主要介绍了详解Vue 非父子组件通信方法(非Vuex),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-05-27
- 本篇文章主要介绍了React组件通信详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-10-15
- 这篇文章主要介绍了React中组件之间通信的方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-07-27
- 这篇文章主要介绍了详解C语言进程同步机制的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-06-18
- 在前一篇中我们介绍了键盘和鼠标事件,其实还有一个非常常用的事件,就是定时器事件,如果要对程序实现时间上的控制,那么就要使用到定时器。而随机数也是很常用的一个功能,在我们要想产生一个随机的结果时就要使用到随机数。本文我们就来简单介绍一下定时器和随机数。...2020-04-25
- 这篇文章主要介绍了C#串口通信实现方法,详细讲述了C#串口通信所涉及的数据接收与发送方法,以及相关的线程调用方法,是非常典型的应用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#中使用UDP通信实例,非常实用的技巧,需要的朋友可以参考下...2020-06-25
- vue通过provide & inject两个关键字完成父组件向子孙组件直接传值,很像子类能够使用父类的属性一样方便。provide & inject一般用于多层之间的传值,两层之间还是使用props进行...2021-10-10