您当前的位置: 首页 >  ar

wendy_ya

暂无认证

  • 1浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt实战案例(40)——利用QSharedMemory类实现进程间通信的功能

wendy_ya 发布时间:2022-02-28 17:54:24 ,浏览量:1

目录
    • 一、项目介绍
    • 二、项目基本配置
    • 三、UI界面设计
    • 四、主程序实现
      • 4.1 widget.h头文件
      • 4.2 widget.cpp源文件
    • 五、效果演示

一、项目介绍

利用QSharedMemory类实现进程间通信,使用共享内存,它实现的功能是:先将一张图片写入到共享内存段中,然后再从共享内存段读出该图片。

二、项目基本配置

新建一个Qt案例,项目名称为“IPCTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建。

三、UI界面设计

UI界面布局如下: 在这里插入图片描述 界面中创建了3个控件,其名称和类型如下:

序号名称类型属性①loadFromFileQPushButtontext:从文件中加载图片②loadFromMemoryQPushButtontext:从共享内存中加载图片③labelQLabel/ 四、主程序实现 4.1 widget.h头文件

头文件中声明了一个私有对象、一个私有函数和两个私有槽函数:

private:
    QSharedMemory sharedMemory;
    void detach();
    
private slots:
    void on_loadFromFile_clicked();
    void on_loadFromMemory_clicked();
4.2 widget.cpp源文件

在构造函数中设置共享内存键:

    sharedMemory.setKey("QSharedMemoryExample");//设置共享内存键,作为共享内存段的标识

首先定义将进程与共享内存段分离的函数:

//将进程与共享内存段分离
void Widget::detach()
{
    if(!sharedMemory.detach())
        ui->label->setText(tr("无法从共享内存中分离!"));//未分离成功
}

定义loadFromFile按钮点击槽函数(利用QBuffer暂存图片):

//从文件中加载图片
void Widget::on_loadFromFile_clicked()
{
    //判断该进程是否已经连接到共享内存段
    if(sharedMemory.isAttached())
        detach();

    ui->label->setText(tr("请选择一个图片文件!"));
    QString fileName=QFileDialog::getOpenFileName(0, tr("打开图片"),
                                                  QDir::currentPath(),tr("Images (*.png *.jpg *.bmp)"));
    QImage image;
    if (!image.load(fileName)){
        ui->label->setText(tr("选择的文件不是图片,请选择图片文件!"));
        return;
    }
    ui->label->setPixmap(QPixmap::fromImage(image));
    //将图片加载到共享内存
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);//以读写方式打开
    QDataStream out(&buffer);
    outsetText(tr("无法创建共享内存段!"));
        return;
    }
    //进行共享内存段操作之前,需要进行加锁
    sharedMemory.lock();//加锁
    char *to =(char*)sharedMemory.data();
    const char *from = buffer.data().data();
    memcpy(to,from,qMin(sharedMemory.size(), size));//将buffer对应的数据段复制到共享内存段
    sharedMemory.unlock();//解锁
}

定义loadFromMemory按钮点击槽函数:

void Widget::on_loadFromMemory_clicked()
{
    if(!sharedMemory.attach()){
        ui->label->setText(tr("无法连接到共享内存段,\n请先加载一张图片!"));
        qDebug()image;
    sharedMemory.unlock();
    sharedMemory.detach();
    ui->label->setPixmap(QPixmap::fromImage(image));

}
五、效果演示

现在运行两次程序,在一个运行的实例上单击“从文件中加载图片”,然后选择一张图片;然后在第二个运行实例上单击“从共享内存显示图片”按钮,这时便会显示第一个实例中加载的图片: 在这里插入图片描述

如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/82756740

ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

关注
打赏
1659256378
查看更多评论
立即登录/注册

微信扫码登录

0.0383s