QT 程序間通訊之古老的方法(記憶體共享)

2021-06-27 09:25:03 字數 3483 閱讀 8667

原文:

先說下實現共享記憶體的步驟,然後用一具體的例項說明。

向共享記憶體中提供資料的一方:

1,定義qsharedmemory sharememory,並設定標誌名sharememory.setkey();

2,將共享記憶體與主程序分離sharememory.detach();

3,建立共享記憶體 sharememory.create()

;     4,將共享記憶體上鎖sharememory

.lock()

;5,將程序中要共享的資料拷貝到共享記憶體中;

6,將共享記憶體解鎖sharememory

.unlock()

;從共享記憶體中取資料的一方:

1,定義qsharedmemory sharememory,並設定共享記憶體的標誌名sharememory.setkey()注意設定的要與提供記憶體共享的一方要一樣。

2,將共享記憶體上鎖sharememory

.lock();

3,將共享記憶體與主程序繫結sharememory.attach()

,使該程序可以訪問共享記憶體的資料;

4,從共享記憶體中取資料;

5,使用完後將共享記憶體解鎖sharememory

.unlock()

,另外將共享記憶體與該程序分離sharememory.detach()

;下面貼段**來說明:

a向共享記憶體中提供資料的一方

[html]view plain

copy

main.cpp  

#include <

#include "widget.h"  

int main(int argc, char *argv)    

[html]view plain

copy

widget.h  

ifndef widget_h  

#define widget_h  

#include <

qwidget

>

#include <

qsharedmemory

>

namespace ui   

class widget : public qwidget  

;  #endif // widget_h  

[html]view plain

copy

widget.cpp  

#include "widget.h"  

#include "ui_widget.h"  

#include <

qfiledialog

>

#include <

qbuffer

>

#include <

qdebug

>

#include <

qprocess

>

widget::widget(qwidget *parent) :  

qwidget(parent),  

ui(new ui::widget)  

widget::~widget()  

void widget::on_pushbutton_clicked()  

qstring filename = qfiledialog::getopenfilename(this);  

qpixmap pixmap;  

pixmap.load(filename);  

ui->label->setpixmap(pixmap);  

qbuffer buffer;  

qdatastream out(&buffer);  

buffer.open(qbuffer::readwrite);  

out<

<

pixmap;  

qdebug()<

<

buffer.size();  

int size = buffer.size();  

if(!sharememory.create(size))  

qdebug()<

<

sharememory.size();  

sharememory.lock();  

char *to = (char*)sharememory.data();  

const char *from = (char*)buffer.data().data();  

memcpy(to,from,qmin(size,sharememory.size()));//資料從該程序中拷貝到共享資料記憶體中  

sharememory.unlock();//共享內層解鎖  

}  

b從共享記憶體中取資料的一方:

[cpp]view plain

copy

main.cpp  

#include "widget.h"

int main(int argc, char *argv)    

[cpp]view plain

copy

widget.h  

#ifndef widget_h

#define widget_h

#include 

#include 

namespace ui   

class widget : public qwidget  

;  #endif // widget_h

[cpp]view plain

copy

widget.cpp  

#include "widget.h"

#include "ui_widget.h"

#include 

#include 

widget::widget(qwidget *parent) :  

qwidget(parent),  

ui(new ui::widget)  

widget::~widget()  

void widget::on_pushbutton_clicked()  

qbuffer buffer;  

qdatastream in(&buffer);  

qpixmap pixmap;  

sharememory.lock();//給sharememory枷鎖

qdebug()buffer.open(qbuffer::readwrite);  

in>>pixmap;  

sharememory.unlock();//將sharememory解鎖

sharememory.detach();//將sharememeory與該程序分離

ui->label->setpixmap(pixmap);  

QT 程序間通訊之古老的方法(記憶體共享)

2012 12 14 21 57 9086人閱讀收藏 舉報 qt 6 先說下實現共享記憶體的步驟,然後用一具體的例項說明。向共享記憶體中提供資料的一方 1,定義qsharedmemory sharememory,並設定標誌名sharememory.setkey 2,將共享記憶體與主程序分離share...

Qt之程序間通訊(QProcess)

qprocess可以在應用程式內部與其它程序通訊,或啟動其它應用程式。與在終端機之類的命令輸入視窗上使用名稱和引數是一樣的,可以使用qprocess提供的函式start 啟動程序。可以註冊qstringlist處理程序後的引數。命令列讀取 更多參考 程序a 帶參啟動程序b 一般編寫程式時,嚴格來說,...

Qt之程序間通訊(QProcess)

qprocess可以在應用程式內部與其它程序通訊,或啟動其它應用程式。與在終端機之類的命令輸入視窗上使用名稱和引數是一樣的,可以使用qprocess提供的函式start 啟動程序。可以註冊qstringlist處理程序後的引數。命令列讀取 更多參考 程序a 帶參啟動程序b 一般編寫程式時,嚴格來說,...