Qt进程间通信

Qt中实现进程间通信的方法诸多,这里讲解比较简单的共享内存类QSharedMemory在这之前,先来看看这个类,其实函数不是很多,详细资料到官方文档查看

演示
img

下面代码注释写的比较清楚了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include<QDebug>
//内存共享 标识符
#define MEM_KEY "_sharedMemKey_"
#include<QPixmap>
#include<QBuffer>
#define PIX_MAP "test.jpg"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置内存标志 key
sharedMemory=new QSharedMemory(this);
sharedMemory->setKey(MEM_KEY);
}
Widget::~Widget()
{
delete ui;
}
//载入图片到内存
void Widget::on_pushButton_clicked()
{
//如果已经绑定,则分离
if(sharedMemory->isAttached()){
sharedMemory->detach();
}
QPixmap pmp;
pmp.load(PIX_MAP);
ui->label->setPixmap(pmp.scaled(ui->label->size()));
//图像的数据(QPixmap)---> ( QDataStream )-->QBuffer
QBuffer tmpBuffer;
//打开 缓存区设备
tmpBuffer.open(QIODevice::ReadWrite);
//数据流与缓存区关联
QDataStream dataOutstream(&tmpBuffer);
//图像数据输入到数据流
dataOutstream<<pmp;
//获取缓存区(图像)字节大小
int bufferSize=tmpBuffer.size();
//创建共享内存
if(sharedMemory->create(bufferSize)){
//lock
sharedMemory->lock();
//memset(sharedMemory->data(),0,bufferSize);
//获取图像数据
const char *datasharedBuffer= tmpBuffer.data().data();
//获取共享内存地址
char *datasharedMemory=(char *)sharedMemory->data();
//图像数据 拷贝到 共享内存中
memcpy(datasharedMemory,datasharedBuffer,bufferSize);
//unlock
sharedMemory->unlock();
}
tmpBuffer.close();
}
//从共享内存获取图像数据
void Widget::on_pushButton_2_clicked()
{
//进程与共享内存绑定!,,注意要设置好标识符 key
if(sharedMemory->attach()){
qDebug()<<"ok!";
sharedMemory->lock();
// 图像的数据(QPixmap) <--- ( QDataStream ) <--- QBuffer
QBuffer buffer;
char *dataSharedMem=(char*)sharedMemory->data();
int dataSize =sharedMemory->size();
//设置共享内存的数据到缓存区
buffer.setData(QByteArray(dataSharedMem,dataSize));
QPixmap pmp;
buffer.open(QIODevice::ReadOnly);
//关联缓存区数据到数据流
QDataStream dataInStream(&buffer);
dataInStream>>pmp;
ui->label->setPixmap(pmp.scaled(ui->label->size()));
//进程与共享内存分离
sharedMemory->unlock();
if(sharedMemory->isAttached()){
sharedMemory->detach();
}
buffer.close();
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!