QT间进程通信之共享内存
Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。
下面的例子以两个进程exe共享一块内存为例。
先说下实现共享内存的步骤,然后用一具体的实例说明。
向共享内存中提供数据的一方:
写入数据的顺序,最后是先调用一次detach(),然后调用create()重新申请内存。此时detach()实际上是清除共享内存中数据的作用,
1,定义QSharedMemory shareMemory,并设置标志名shareMemory.setKey();//告诉os,我要使用这块memory,
2,将共享内存与主进程分离 shareMemory.detach();//如果是当前exe是最后一个使用该memory的进程,那么detach()后,该共享内存的内存地址就被os释放了,即data()返回null。
但是key还在,还可以使用后面的create()再重新向os申请内存,
3,创建共享内存 shareMemory.create();//向os申请内存
4,将共享内存上锁shareMemory.lock();
5,将进程中要共享的数据拷贝到共享内存中;
6,将共享内存解锁shareMemory.unlock();
写完后,坚决不能调用detach(),如果调用detach(),那么共享内存的内存会被os释放掉,写入的字节就被删除,
从共享内存中取数据的一方:(读取数据,必须调用attach())
1,定义QSharedMemory shareMemory,并设置共享内存的标志名shareMemory.setKey()注意设置的要与提供内存共享的一方要一样。
2,将共享内存上锁shareMemory.lock();
3,将共享内存与主进程绑定shareMemory.attach(),使该进程可以访问共享内存的数据;
4,从共享内存中取数据;
5,使用完后将共享内存解锁shareMemory.unlock(),另外将共享内存与该进程分离shareMemory.detach();