原文:
先說下實現共享記憶體的步驟,然後用一具體的例項說明。
向共享記憶體中提供資料的一方:
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 一般編寫程式時,嚴格來說,...