Qt进程间通信 之使用QSharedMemory

本文介绍了Qt库中QSharedMemory在Windows和Unix系统下处理进程间通信的方式。在Windows上,共享内存段会在所有相关进程结束后自动释放;而在Unix中,QSharedMemory对象的析构会导致内存段释放,未正确管理可能导致程序崩溃。
摘要由CSDN通过智能技术生成
应用场景:
比如 QQ 与 QQ 音乐、QQ 影音等共享用户头像。

使用QSharedMemory 入门,看这篇基本就够了。

摘要:
0、  QSharedMemory 是Qt 提供的一种各个平台均有支持的进程间交互的方式。
1、 Qt 使用 QSharedMemory 类操作共享内存段。我们可以把 QSharedMemory 看做一种指针,这种指针指向分配出来的一个共享内存段。而这个共享内存段是由底层的操作系统提供,可以供多个线程或进程使用。因此, QSharedMemory 可以看做是专供 Qt 程序访问这个共享内存段的指针。
2、 进程间通信(Inter-Process Communication,IPC) 离不开平台特性。有关共享内存段,各个平台的实现也有所不同:
  • Windows:QSharedMemory不“拥有”共享内存段。当使用了共享内存段的所有线程或进程中的某一个销毁了QSharedMemory实例,或者所有的都退出,Windows 内核会自动释放共享内存段。
  • Unix:QSharedMemory“拥有”共享内存段。当最后一个线程或进程同共享内存分离,并且调用了QSharedMemory的析构函数之后,Unix 内核会将共享内存段释放。注意,这里与 Windows 不同之处在于,如果使用了共享内存段的线程或进程没有调用QSharedMemory的析构函数,程序将会崩溃。
3、初始化 QSharedMemory 对象时,指定一个字符串名称,两个进程就是用这个字符串识别共享内存的。

这篇的例子是在一个进程里,我来一个在两个进程里实现的。
先在app1里输入fff,点击send。
在app2里点击read,TextLabel会变成fff
代码见最后。win7、qt creator、qt 5.6.2。要用designer自己画一下ui。

Qt官方文档的例子:

使用Dll文件实现进程间通信:
用#pragma data_seg()在DLL中定义一个共享的,有名字的数据段。
Qt 中,可以使用 QSharedMemory 类实现共享内存,进程间通信的过程包括以下步骤: 1. 创建共享内存区域:在某个进程中创建一个 QSharedMemory 对象,调用 create() 函数创建共享内存区域,指定共享内存的大小和其他属性。 2. 连接共享内存区域:在其他进程中也创建一个 QSharedMemory 对象,调用 attach() 函数连接到已经创建的共享内存区域,获取共享内存的地址。多个进程可以通过同一个 key 值连接到同一块共享内存区域。 3. 在共享内存中进行数据交换:多个进程都可以访问共享内存区域中的数据,可以使用锁机制等方式来确保数据的同步和正确性。在 Qt 中,可以使用 QMutex 等类来实现锁机制。 4. 调用函数:在共享内存中存储的数据通常是一些结构体、类或对象等,可以在一个进程中修改这些数据,然后在另一个进程中调用相应的函数来处理这些数据。在 Qt 中,可以使用 QBuffer、QDataStream 等类来实现数据的序列化和反序列化,以便在进程间传递数据。 5. 断开共享内存连接:当不再需要访问共享内存区域时,需要调用 detach() 函数断开与共享内存的连接。 6. 删除共享内存区域:当所有进程都不再使用共享内存区域时,需要调用 QSharedMemory 的 static remove() 函数删除共享内存区域,释放资源。 需要注意的是,在使用共享内存进行进程间通信时,需要考虑数据同步和互斥等问题,以避免数据竞争和死锁等情况。同时,由于共享内存是操作系统资源,应该在使用完毕后及时释放,避免内存泄漏和资源浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值