中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt如何實現進程間通信

發布時間:2022-08-25 15:38:30 來源:億速云 閱讀:312 作者:iii 欄目:開發技術

這篇文章主要介紹“Qt如何實現進程間通信”,在日常操作中,相信很多人在Qt如何實現進程間通信問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”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. 不同進程間共享內存示例代碼

Qt如何實現進程間通信

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

到此,關于“Qt如何實現進程間通信”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

伊金霍洛旗| 马边| 宜都市| 日照市| 洪雅县| 东辽县| 双辽市| 日土县| 郁南县| 启东市| 张家口市| 四子王旗| 北碚区| 雷山县| 金沙县| 和田县| 陈巴尔虎旗| 渑池县| 郸城县| 柳江县| 巴东县| 周口市| 绿春县| 古蔺县| 精河县| 平利县| 璧山县| 慈溪市| 图片| 开平市| 辉南县| 敦煌市| 石狮市| 芜湖县| 米脂县| 农安县| 花垣县| 西昌市| 响水县| 莱西市| 星子县|