首頁 > 軟體

Qt實現程序間通訊

2022-08-19 18:00:44

本文範例為大家分享了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();
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com