Qt實(shí)現(xiàn)進(jìn)程間通信
本文實(shí)例為大家分享了Qt實(shí)現(xiàn)進(jìn)程間通信的具體代碼,供大家參考,具體內(nèi)容如下
1. 進(jìn)程間通信的方法
1.TCP/IP
Qt Network提供了眾多的類來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)編程。
2.共享內(nèi)存
QSharedMemory是跨平臺(tái)的共享內(nèi)存類,提供了訪問(wèn)操作系統(tǒng)共享內(nèi)存的實(shí)現(xiàn)。它允許多個(gè)線程和進(jìn)程安全地訪問(wèn)共享內(nèi)存片段。此外,QSystemSemaphore可用于控制系統(tǒng)的共享資源的訪問(wèn)以及進(jìn)程間通信。
3.D-Bus
D-Bus模塊是一個(gè)Unix庫(kù),可以使用D-Bus協(xié)議來(lái)實(shí)現(xiàn)進(jìn)程間通信。它將Qt的信號(hào)和槽機(jī)制擴(kuò)展到了IPC層面,允許一個(gè)進(jìn)程發(fā)射的信號(hào)關(guān)聯(lián)到另一個(gè)進(jìn)程的槽上。
4.QProcess
5.會(huì)話管理
在Linux/X11平臺(tái)上,Qt提供了對(duì)會(huì)話管理的支持,回話允許時(shí)間傳播到進(jìn)程。例如,當(dāng)關(guān)機(jī)時(shí)通知進(jìn)程或程序,從而可以執(zhí)行一些相關(guān)的操作。
2. 不同進(jìn)程間共享內(nèi)存示例代碼

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_Hdialog.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);
? ? //在共享內(nèi)存以前,需要先為其制定一個(gè)key,系統(tǒng)用它來(lái)作為底層共享內(nèi)存段的標(biāo)識(shí)。這個(gè)key可以是任意的字符串
? ? sharedMemory.setKey("QSharedMemoryExample");
}
Dialog::~Dialog()
{
? ? delete ui;
}
void Dialog::loadFromFile()
{
? ? //判斷該進(jìn)程是否已經(jīng)連接到共享內(nèi)存段,如果是,就將該進(jìn)程與共享內(nèi)存段進(jìn)行分離。
? ? if(sharedMemory.isAttached())
? ? ? ? detach();
? ? ui->label->setText(tr("選擇一個(gè)圖片文件!"));
? ? QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),tr("Images(*.png *.jpg)"));
? ? QImage image;
? ? if(!image.load(fileName))
? ? {
? ? ? ? ui->label->setText(tr("選擇的文件不是圖片,請(qǐng)選擇圖片文件"));
? ? ? ? return;
? ? }
? ? ui->label->setPixmap((QPixmap::fromImage(image)));
? ? //將圖片加載到共享內(nèi)存
? ? QBuffer buffer;
? ? //將圖片暫存到buffer中
? ? buffer.open(QBuffer::ReadWrite);
? ? //獲取圖片數(shù)據(jù)的指針
? ? QDataStream out(&buffer);
? ? out<<image;
? ? //獲取圖片的大小
? ? int size = buffer.size();
? ? //創(chuàng)建指定大小的共享內(nèi)存段
? ? if(!sharedMemory.create(size))
? ? {
? ? ? ? ui->label->setText(tr("無(wú)法創(chuàng)建共享內(nèi)存段"));//
? ? ? ? return;
? ? }
? ? //在共享內(nèi)存段的操作時(shí),需要先加鎖
? ? sharedMemory.lock();
? ? char * to = (char*)sharedMemory.data();
? ? const char * from = buffer.data().data();
? ? memcpy(to,from,qMin(sharedMemory.size(),size));
? ? //解鎖
? ? sharedMemory.unlock();
? ? //如果將最后一個(gè)連接在共享內(nèi)存段上的進(jìn)程進(jìn)行分離,那么系統(tǒng)會(huì)釋放共享內(nèi)存段。
}
void Dialog::loadFromMemory()
{
? ? //將進(jìn)程連接到共享內(nèi)存段
? ? if(!sharedMemory.attach())
? ? {
? ? ? ? ui->label->setText(tr("無(wú)法連接到共享內(nèi)存段,\n"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "請(qǐng)先加載一張圖片!"));
? ? ? ? return;
? ? }
? ? QBuffer buffer;
? ? QDataStream in(&buffer);
? ? QImage image;
? ? sharedMemory.lock();
? ? //讀取內(nèi)存段中的數(shù)據(jù)
? ? 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("無(wú)法從共享內(nèi)存中分離"));
? ? }
}
void Dialog::on_pushButtonLoadFromFile_clicked()
{
? ? loadFromFile();
}
void Dialog::on_pushButtonLoadFromSharedMemory_clicked()
{
? ? loadFromMemory();
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Qt實(shí)現(xiàn)簡(jiǎn)單的TCP通信
- QT編寫(xiě)tcp通信工具(Client篇)
- QT編寫(xiě)tcp通信工具(Server端)
- QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解
- Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)
- Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信
- Qt實(shí)現(xiàn)簡(jiǎn)單UDP通信
- QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)
- 基于QT的TCP通信服務(wù)的實(shí)現(xiàn)
- QT5實(shí)現(xiàn)UDP通信的示例代碼
- QT串口通信的實(shí)現(xiàn)方法
相關(guān)文章
C語(yǔ)言如何實(shí)現(xiàn)翻轉(zhuǎn)字符串中的單詞
這篇文章主要介紹了C語(yǔ)言如何實(shí)現(xiàn)翻轉(zhuǎn)字符串中的單詞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C語(yǔ)言高級(jí)教程之變長(zhǎng)數(shù)組詳解
這篇文章主要介紹了C語(yǔ)言中變長(zhǎng)數(shù)組的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
C語(yǔ)言實(shí)現(xiàn)空戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)空戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用
本篇文章主要包括內(nèi)聯(lián)函數(shù)和auto關(guān)鍵字。其中,內(nèi)斂函數(shù)包括概念,特性等;auto關(guān)鍵字的使用規(guī)則,使用場(chǎng)景等,接下來(lái)讓我們深入了解2022-05-05
C語(yǔ)言實(shí)現(xiàn)房屋管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)房屋管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C語(yǔ)言內(nèi)存泄漏常見(jiàn)情況及解決方案詳解
這篇文章主要為大家介紹了C語(yǔ)言內(nèi)存泄漏常見(jiàn)情況及解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
你知道如何自定義sort函數(shù)中的比較函數(shù)
這篇文章主要介紹了如何自定義sort函數(shù)中的比較函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

