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

2021-08-01 20:45:53 字數 3817 閱讀 8197

2012-12-14 21:57

9086人閱讀收藏 

舉報

qt(6)

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

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

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 <

qtgui

>

#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"

intmain(

intargc, 

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

*)sharememory.constdata(),sharememory.size());

//將sharememeory裡的資料放到buffer裡

buffer.open(qbuffer::readwrite);  

in>>pixmap;  

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

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

ui->label->setpixmap(pixmap);  

}  

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

原文 先說下實現共享記憶體的步驟,然後用一具體的例項說明。向共享記憶體中提供資料的一方 1,定義qsharedmemory sharememory,並設定標誌名sharememory.setkey 2,將共享記憶體與主程序分離sharememory.detach 3,建立共享記憶體 sharemem...

Qt之程序間通訊(QProcess)

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

Qt之程序間通訊(QProcess)

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