大家好,欢迎来到IT知识分享网。
虽说Qt是跨平台的IDE,但是在进程间通信,不同的平台有不同的方式。下面我们就来具体说说如何在不同的平台下使用Qt来进行进程间通信的,实现数据共享。
Qt进程间通信主要分为以下几种:
1:TCP/IP,我们可以用一些网络的手段进行2个软件间进行数据通信,发送相关数据,实现数据共享,常用的有QTcpSocket,QTcpServer等等;
2:共享内存方式,支持跨平台操作,常见的操作类为QSharedMemory,可以访问操作系统的共享内存,可以允许多个进程和多个线程安全的访问共享内存数据;
3:D-Bus,是一个在Unix平台的库,可以使用信号和槽的方式,一个进程发送信号,另一个进程接收;
4:使用QProcess和会话管理;
5:使用读写本地文件方式,实时对文件进行加锁操作,固定格式解析;
以上这么多种方式,本人还是比较推荐使用共享内存的方式,毕竟它支持跨平台操作,省去了很多为以后跨平台的麻烦,下面我们就来实现以共享内存的方式进行进程间通信:
进程1-写共享内存主要有下面几个步骤:
- 使用isAttached()函数检测该进程连接到共享内存段,如果已经连接到共享内存段,则将使用detach()函数将该进程与共享内存段进行分离断开;
- 使用create()函数在系统中创建一个新的共享内存区域;
- 将新创建的共享区域进行锁定,防止其他进程进行访问,然后再将缓存的数据复制到共享内存区域;
- 最后将已经拷贝好数据的共享内存区域进行解锁,供其他进程进行访问;
// 设置key系统用它作为底层共享内存段的标识
QSharedMemory sharedMemory;
sharedMemory.setKey("QSharedMemoryExample");
////此函数主要是实现以上的步骤,分离-创建-锁定拷贝数据-解锁
void Dialog::loadFromFile() {
if (sharedMemory.isAttached())
detach();
QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(), tr("Images (*.png *.jpg)"));
QImage image;
if (!image.load(fileName)) {
ui->label->setText(tr("选择的文件不是图片,请选择图片文件!"));
return;
}
ui->label->setPixmap(QPixmap::fromImage(image));
// 将图片加载到共享内存
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << image;
int size = buffer.size();
if (!sharedMemory.create(size)) {
ui->label->setText(tr("无法创建共享内存段!"));
return;
}
sharedMemory.lock();
char* to = (char*)sharedMemory.data();
const char* from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));
sharedMemory.unlock();
}
进程2-写共享内存主要分为以下几个步骤:
- 将进程2写与进程1读的共享内存区域进行绑定;
- 进程2写,锁定共享内存区域,然后将共享内存区域数据复制数据到缓冲区,然后写入到图片变量QImage中。
- 将共享内存区域进行解锁,再将进程2写与共享内存区域进行分离,以供其他进程进行访问;
////此函数主要是实现以上的步骤,拷贝共享内存数据,然后使用此数据
void Dialog::loadFromMemory() {
if (!sharedMemory.attach()) {
ui->label->setText(tr("无法连接到共享内存段,\n"
"请先加载一张图片!"));
return;
}
QBuffer buffer;
QDataStream in(&buffer);
QImage image;
sharedMemory.lock();
buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
buffer.open(QBuffer::ReadOnly);
in >> image;
sharedMemory.unlock();
sharedMemory.detach();
ui->label->setPixmap(QPixmap::fromImage(image));
}
以上,我们就实现了共享内存的读和写,实现了进程间的通信。多谢和大家交流学习!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48203.html