当前位置:   article > 正文

Qt如何实现进程间通信_qt 进程发消息给 另外一个进程

qt 进程发消息给 另外一个进程

1. 进程间通信的方法

1.TCP/IP

Qt Network提供了众多的类来实现网络编程

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

2.共享内存

QSharedMemory是跨平台的共享内存类,提供了访问操作系统共享内存的实现。它允许多个线程和进程安全地访问共享内存片段。此外,QSystemSemaphore可用于控制系统的共享资源的访问以及进程间通信。

3.D-Bus

D-Bus模块是一个Unix库,可以使用D-Bus协议来实现进程间通信。它将Qt的信号和槽机制扩展到了IPC层面,允许一个进程发射的信号关联到另一个进程的槽上。

4.QProcess

5.会话管理

在Linux/X11平台上,Qt提供了对会话管理的支持,回话允许时间传播到进程。例如,当关机时通知进程或程序,从而可以执行一些相关的操作。

2. 不同进程间共享内存示例代码

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. #include <QSharedMemory>
  5. namespace Ui {
  6. class Dialog;
  7. }
  8. class Dialog : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Dialog(QWidget *parent = 0);
  13. ~Dialog();
  14. private:
  15. Ui::Dialog *ui;
  16. QSharedMemory sharedMemory;
  17. void detach();
  18. public slots:
  19. void loadFromFile();
  20. void loadFromMemory();
  21. private slots:
  22. void on_pushButtonLoadFromFile_clicked();
  23. void on_pushButtonLoadFromSharedMemory_clicked();
  24. };
  25. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. #include <QFileDialog>
  4. #include <QBuffer>
  5. #include <QDebug>
  6. Dialog::Dialog(QWidget *parent) :
  7. QDialog(parent),
  8. ui(new Ui::Dialog)
  9. {
  10. ui->setupUi(this);
  11. //在共享内存以前,需要先为其制定一个key,系统用它来作为底层共享内存段的标识。这个key可以是任意的字符串
  12. sharedMemory.setKey("QSharedMemoryExample");
  13. }
  14. Dialog::~Dialog()
  15. {
  16. delete ui;
  17. }
  18. void Dialog::loadFromFile()
  19. {
  20. //判断该进程是否已经连接到共享内存段,如果是,就将该进程与共享内存段进行分离。
  21. if(sharedMemory.isAttached())
  22. detach();
  23. ui->label->setText(tr("选择一个图片文件!"));
  24. QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),tr("Images(*.png *.jpg)"));
  25. QImage image;
  26. if(!image.load(fileName))
  27. {
  28. ui->label->setText(tr("选择的文件不是图片,请选择图片文件"));
  29. return;
  30. }
  31. ui->label->setPixmap((QPixmap::fromImage(image)));
  32. //将图片加载到共享内存
  33. QBuffer buffer;
  34. //将图片暂存到buffer中
  35. buffer.open(QBuffer::ReadWrite);
  36. //获取图片数据的指针
  37. QDataStream out(&buffer);
  38. out<<image;
  39. //获取图片的大小
  40. int size = buffer.size();
  41. //创建指定大小的共享内存段
  42. if(!sharedMemory.create(size))
  43. {
  44. ui->label->setText(tr("无法创建共享内存段"));//
  45. return;
  46. }
  47. //在共享内存段的操作时,需要先加锁
  48. sharedMemory.lock();
  49. char * to = (char*)sharedMemory.data();
  50. const char * from = buffer.data().data();
  51. memcpy(to,from,qMin(sharedMemory.size(),size));
  52. //解锁
  53. sharedMemory.unlock();
  54. //如果将最后一个连接在共享内存段上的进程进行分离,那么系统会释放共享内存段。
  55. }
  56. void Dialog::loadFromMemory()
  57. {
  58. //将进程连接到共享内存段
  59. if(!sharedMemory.attach())
  60. {
  61. ui->label->setText(tr("无法连接到共享内存段,\n"
  62. "请先加载一张图片!"));
  63. return;
  64. }
  65. QBuffer buffer;
  66. QDataStream in(&buffer);
  67. QImage image;
  68. sharedMemory.lock();
  69. //读取内存段中的数据
  70. buffer.setData((char*)sharedMemory.constData(),sharedMemory.size());
  71. buffer.open(QBuffer::ReadOnly);
  72. in>>image;
  73. sharedMemory.unlock();
  74. sharedMemory.detach();
  75. ui->label->setPixmap(QPixmap::fromImage(image));
  76. }
  77. void Dialog::detach()
  78. {
  79. if(!sharedMemory.detach())
  80. {
  81. ui->label->setText(tr("无法从共享内存中分离"));
  82. }
  83. }
  84. void Dialog::on_pushButtonLoadFromFile_clicked()
  85. {
  86. loadFromFile();
  87. }
  88. void Dialog::on_pushButtonLoadFromSharedMemory_clicked()
  89. {
  90. loadFromMemory();
  91. }

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/184773
推荐阅读
相关标签
  

闽ICP备14008679号