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 }
浙公網安備 33010602011771號