Qt进程间通信详解–C/C++

Qt进程间通信详解–C/C++虽说Qt是跨平台的IDE,但是在进程间通信,不同的平台有不同的方式。下面我们就来具体说说如何在不同的平台下使用Qt来进行进程间通信的,实现数据共

大家好,欢迎来到IT知识分享网。

虽说Qt是跨平台的IDE,但是在进程间通信,不同的平台有不同的方式。下面我们就来具体说说如何在不同的平台下使用Qt来进行进程间通信的,实现数据共享。

Qt进程间通信主要分为以下几种:

1:TCP/IP,我们可以用一些网络的手段进行2个软件间进行数据通信,发送相关数据,实现数据共享,常用的有QTcpSocket,QTcpServer等等;

2:共享内存方式,支持跨平台操作,常见的操作类为QSharedMemory,可以访问操作系统的共享内存,可以允许多个进程和多个线程安全的访问共享内存数据;

3:D-Bus,是一个在Unix平台的库,可以使用信号和槽的方式,一个进程发送信号,另一个进程接收;

4:使用QProcess和会话管理;

5:使用读写本地文件方式,实时对文件进行加锁操作,固定格式解析;

以上这么多种方式,本人还是比较推荐使用共享内存的方式,毕竟它支持跨平台操作,省去了很多为以后跨平台的麻烦,下面我们就来实现以共享内存的方式进行进程间通信:

进程1-写共享内存主要有下面几个步骤:

  1. 使用isAttached()函数检测该进程连接到共享内存段,如果已经连接到共享内存段,则将使用detach()函数将该进程与共享内存段进行分离断开;
  2. 使用create()函数在系统中创建一个新的共享内存区域;
  3. 将新创建的共享区域进行锁定,防止其他进程进行访问,然后再将缓存的数据复制到共享内存区域;
  4. 最后将已经拷贝好数据的共享内存区域进行解锁,供其他进程进行访问;
// 设置key系统用它作为底层共享内存段的标识
QSharedMemory sharedMemory;
sharedMemory.setKey("QSharedMemoryExample");

////此函数主要是实现以上的步骤,分离-创建-锁定拷贝数据-解锁
void Dialog::loadFromFile() {
    if (sharedMemory.isAttached())
        detach();

    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.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();
}

进程2-写共享内存主要分为以下几个步骤:

  1. 将进程2写与进程1读的共享内存区域进行绑定;
  2. 进程2写,锁定共享内存区域,然后将共享内存区域数据复制数据到缓冲区,然后写入到图片变量QImage中。
  3. 将共享内存区域进行解锁,再将进程2写与共享内存区域进行分离,以供其他进程进行访问;
////此函数主要是实现以上的步骤,拷贝共享内存数据,然后使用此数据
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));
}
Qt进程间通信详解--C/C++

实现效果图

以上,我们就实现了共享内存的读和写,实现了进程间的通信。多谢和大家交流学习!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48203.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信