Qt实现进程间通信

 更新时间:2022年8月19日 17:01  点击:50 作者: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

相关文章

  • php定时计划任务与fsockopen持续进程实例

    Web服务器执行一个PHP脚本,有时耗时很长才能返回执行结果,后面的脚本需要等待很长一段时间才能继续执行。如果想实现只简单触发耗时脚本的执行而不等待执行结果就直接执行下一步操作,可以通过fscokopen函数来实现。PHP支...2014-05-31
  • 详解C语言进程同步机制

    这篇文章主要介绍了详解C语言进程同步机制的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-06-18
  • Qt定时器和随机数详解

    在前一篇中我们介绍了键盘和鼠标事件,其实还有一个非常常用的事件,就是定时器事件,如果要对程序实现时间上的控制,那么就要使用到定时器。而随机数也是很常用的一个功能,在我们要想产生一个随机的结果时就要使用到随机数。本文我们就来简单介绍一下定时器和随机数。...2020-04-25
  • php安装pcntl扩展实现多进程

    pcntl中的php必须要安装pcntl才可以实现多线程了,在网上找到许多的关于pcntl安装教程,下面整理了一篇比较完整的关于php pcntl安装与使用方法。 pcntl中php实现多进...2016-11-25
  • 一篇文章教你3分钟如何发布Qt程序

    这篇文章主要给大家介绍了关于教你3分钟如何发布Qt程序的相关资料,文中通过实例代码结束的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-08-24
  • 深入浅析WinForm 进程、线程及区别介绍

    进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。这篇文章主要介绍了WinForm 进程、线程的相关资料,需要的朋友可以参考下...2021-09-22
  • Qt实现闹钟小程序

    这篇文章主要为大家详细介绍了Qt实现闹钟小程序,利用Qt的designer设计需要的闹钟界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Python基础之Socket通信原理

    这篇文章主要介绍了Python基础之Socket通信原理,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-22
  • 用c语言实现HUP信号重启进程的方法

    本篇文章是对使用c语言实现HUP信号重启进程的方法进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • Asp.net core利用MediatR进程内发布/订阅详解

    这篇文章主要给大家介绍了关于Asp.net core利用MediatR进程内发布/订阅的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Asp.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-09-22
  • C#获取所有进程的方法

    在本篇文章里小编给大家分享了关于C#获取所有进程的方法和步骤,有需要的朋友们跟着学习参考下。...2020-06-25
  • C#实现子窗体与父窗体通信方法实例总结

    这篇文章主要介绍了C#实现子窗体与父窗体通信方法,实例总结了常用的四种窗体通信方法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 浅谈Qt信号与槽的各种连接方式

    信号和槽是Qt特有的信息传输机制,本文主要介绍了浅谈Qt信号与槽的各种连接方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • [PHP]进程篇

    最近写了一个 监控在线进程的程序. 目的是为了 能实时监控执行程序是否断线,并及时重启。 用PHP写的,不算难,还成,但对于自己来讲挺有成就感的。 程序部分略省。 #将perl...2016-11-25
  • C#使用UdpClient类进行简单通信的实例

    本文主要介绍了C#使用UdpClient类进行简单通信的实例,具有很好的参考价值,需要的朋友可以看下...2020-06-25
  • C#中进程的挂起与恢复

    这篇文章主要介绍了C#中进程的挂起与恢复操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Redis fork进程分配不到内存解决方案

    这篇文章主要介绍了Redis fork进程分配不到内存解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-01-15
  • 将matplotlib绘图嵌入pyqt的方法示例

    这篇文章主要介绍了将matplotlib绘图嵌入pyqt的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-27
  • window调用api列出当前所有进程示例

    这篇文章主要介绍了window调用api列出当前所有进程示例,需要的朋友可以参考下...2020-04-25
  • android实现线程间通信的四种常见方式

    线程通信相信大家都不陌生了,但是你知道几种方法呢,本文主要介绍了android实现线程间通信的四种常见方式,分享给大家,需要的朋友们下面随着小编来一起学习学习吧...2021-05-13