Qt進程間通信


QProcess允許將一個進程視為順序IO設備

#include<QProcess>

private:

    QProcess myprocess;

 

void MainWindow::on_pushButton_clicked()

{

  myprocess.start("notepad.exe");   // 啟動進程

}

 

2  進程間通信 IPC(Inter-Process Communication):

  1)TCP/IP

  2)   共享內存:

    QSharedMemory 跨平台的共享內存類,提供了訪問操作系統共享內存的實現,允許多個線程和進程安全訪問共享內存段。

    QSystemSemaphore可用於控制系統的共享資源的訪問及進程間訪問

  3) D-BUS

    允許從一個進程發射信號關聯到另一個進程的槽上

  4) Qt通信協議(QCOP):linux應用

    QCopChannel類實現了在客戶端程序間使用有名管道來進行消息傳輸的協議

 

 

QSharedMemory sharedMemory;

// 設置key,系統用它作為底層共享內存段的標識
sharedMemory.setKey("QSharedMemoryExample");

 1 #include "dialog.h"
 2 #include "ui_dialog.h"
 3 
 4 #include <QFileDialog>
 5 #include <QBuffer>
 6 #include <QDebug>
 7 
 8 Dialog::Dialog(QWidget *parent) :
 9     QDialog(parent),
10     ui(new Ui::Dialog)
11 {
12     ui->setupUi(this);
13     // 設置key,系統用它作為底層共享內存段的標識
14     sharedMemory.setKey("QSharedMemoryExample");
15 }
16 
17 Dialog::~Dialog()
18 {
19     delete ui;
20 }
21 
22 void Dialog::loadFromFile()
23 {
24     if (sharedMemory.isAttached())   //判斷該進程是否已經連接到共享內存段
25         detach();                    //如果是,那么調用detach()先將該進程與共享內存段進行分離 
26 
27     ui->label->setText(tr("選擇一個圖片文件!"));
28     QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),        
29                                                     tr("Images (*.png *.jpg)"));            
30     QImage image;
31     if (!image.load(fileName)) {
32         ui->label->setText(tr("選擇的文件不是圖片,請選擇圖片文件!"));
33         return;
34     }
35     ui->label->setPixmap(QPixmap::fromImage(image));
36 
37     // 將圖片加載到共享內存
38     QBuffer buffer;
39     buffer.open(QBuffer::ReadWrite);
40     QDataStream out(&buffer);
41     out << image;
42     int size = buffer.size();
43     if (!sharedMemory.create(size)) {             //create 函數創建指定大小的共享內存段,自動將共享內存段連接到本進程
44         ui->label->setText(tr("無法創建共享內存段!"));
45         return;
46     }
47     sharedMemory.lock();
48     char *to = (char*)sharedMemory.data();
49     const char *from = buffer.data().data();
50     memcpy(to, from, qMin(sharedMemory.size(), size));     //使用memcpy將buffer對應的數據段復制到共享內存段
51     sharedMemory.unlock();
52 }
53 
54 void Dialog::loadFromMemory()
55 {
56     if (!sharedMemory.attach()) {
57         ui->label->setText(tr("無法連接到共享內存段,\n"
58                               "請先加載一張圖片!"));
59         return;
60     }
61 
62     QBuffer buffer;
63     QDataStream in(&buffer);
64     QImage image;
65 
66     sharedMemory.lock();
67     buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
68     buffer.open(QBuffer::ReadOnly);
69     in >> image;
70     sharedMemory.unlock();
71 
72     sharedMemory.detach();                               //現在已經不需要使用共享內存了。所以調用detach函數將進程與共享內存段進行分離
73     ui->label->setPixmap(QPixmap::fromImage(image));
74 }
75 
76 void Dialog::detach()
77 {
78     if (!sharedMemory.detach())
79         ui->label->setText(tr("無法從共享內存中分離!"));
80 }
81 
82 // 從文件中加載圖片按鈕
83 void Dialog::on_loadFromFileButton_clicked()
84 {
85     loadFromFile();
86 }
87 
88 // 從共享內存顯示圖片
89 void Dialog::on_loadFromSharedMemoryButton_clicked()
90 {
91     loadFromMemory();
92 }

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM