(8条消息)QT之QSharedMemory详解进程间通信
QSharedMemory的几个重要接口:
setKey(),这是标记共享内存的一个标识符,
在整个操作系统的共享内存中,用这个key去标识它,唯一标识。
create(),创建共享内存,向os申请内存空间,
如果不创建,调用attach()会失败,
在create()的时候,需要制定共享内存的大小,即字节数,
跟windows的CreateFileMapping()一样,都是需要在create()的时候指定,而且大小是固定的,
从共享内存读取数据的时候,必须要先绑定,写入数据不需要attach(),
attach()函数,在进程中,调用该共享内存的attach()函数,
注意是,将该exe绑定到该共享内存中,
如果要读取某个共享内存,必须要想将exe绑定到共享内存中,只有绑定成功,才能读取,
bool QSharedMemory::detach ()
一定要注意这个函数,系统会自动释放该共享内存,导致其data()返回为空,
detach()后,虽然该块共享内存的地址为null,但是它的key还是存在的,因此,可以继续调用create(),重新申请内存,然后就可以继续使用了。
qt进程间通信
详细使用过程:
向共享内存中提供数据的一方:
写入数据的顺序,最后是先调用一次detach(),然后调用create()重新申请内存。此时detach()实际上是清除共享内存中数据的作用,
1,定义QSharedMemory shareMemory,并设置标志名shareMemory.setKey();//告诉os,我要使用这块memory,
2,将共享内存与主进程分离 shareMemory.detach();//如果是当前exe是最后一个使用该memory的进程,那么detach()后,该共享内存的内存地址就被os释放了,即data()返回null。
但是key还在,还可以使用后面的create()再重新向os申请内存,
3,创建共享内存 ate();//向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();
实现一个共享内存数据交互的线程类,线程的run函数如下:
void run()
{
QSharedMemory  sharedMem;
sharedMem.setKey(m_sharedMemName);
bool res = sharedMem.attach(QSharedMemory::ReadOnly);
if (!res) {
return;
}
while (!m_requestStop) {
sharedMem.lock();
char *memData = (char*)sharedMem.data();
memcpy((void*)&vi, memData, headerSize);
sharedMem.unlock();
//进行业务数据处理
//
sharedMem.unlock();
}
sharedMem.detach();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。