您的位置:首页 > 编程语言 > Qt开发

Qt进程间通信IPC

2014-10-25 12:07 225 查看
Qt进程间通信IPC
sf2gis@163.com
2014年8月29日

1 概述

共享内存是由系统提供一个共享内存区域,供不同的进程共享。因此需要提供给系统一个识别码作为共享内存的名称,并指定需要的内存区域大小。

2 原理

在需要读写内存是,需要连接到此区域(如果是第一次,则需要创建此区域)。然后可以读写此区域的内容。读写完成后要断开连接。操作系统负责此区域内存的分配和释放,维护一个连接列表,如果没有连接,则自动释放。

由于共享内存是由操作系统实际完成的,因此不同的操作系统实际上提供不同的方法。

Qt对不同的系统提供了统一封装,但是如果不在Qt应该程序中使用,则应该使用原始方式(读写应该使用相同的方式),这样才能在非Qt应用程序中使用(与非QT交互时,只能使用原始方式,因为QT会对Key进行改变)。

参考:http://www.devbean.net/2013/11/qt-study-road-2-ipc/

http://hi.baidu.com/mikenoodle/item/06b069869bec6ccdee083d71



3 方法

Qt提供了QSharedMemory类对共享内存进行封装。

3.1 写入内存:

1) 创建:create()生成一个共享内存。需要指定大小和权限。

2) 加锁、解锁:在使用时要先加锁,使用完成后解锁。lock()/unlock().

3) 读取数据:data(),然后转换成自己需要的格式。

4) 写入数据:直接操作内存。memcpy()。

注意:使用delete/detach时,os会检测当前的引用情况,如果无引用则释放。所以创建完成后不能delete。而是根据情况调整策略,如果当前进程结束,则自动释放。

示例:

voidSmUtil::savetoSharedMemory(constchar*strSMName,constchar*strSMData,intiSize)
{
QStringstrName(strSMName);
QSharedMemory*pSharedMemory=newQSharedMemory(strName);
//
pSharedMemory->setNativeKey(strName);
pSharedMemory->create(iSize,QSharedMemory::ReadWrite);

pSharedMemory->lock();
char*to=static_cast<char*>(pSharedMemory->data());
constchar*from=strSMData;
memcpy(to,from,qMin((int)strlen(from),pSharedMemory->size()));
pSharedMemory->unlock();

}

3.2 读取内存

1) 创建共享内存对象

2) 调用attach进行连接

3) 使用时加锁、解锁

4) 直接转换内存

5) 解除连接

6) 释放内存对象

示例:

m_pSharedMemory=newQSharedMemory("REMOTE_CAL_SHARE_MEM_NAME",this);

//    m_pSharedMemory->setNativeKey("REMOTE_CAL_SHARE_MEM_NAME");

if(!m_pSharedMemory->attach()){

qDebug()<<tr("AttachError:")<<m_pSharedMemory->errorString();

}

else

{

m_pSharedMemory->lock();

constchar*pStr=static_cast<constchar*>(m_pSharedMemory->constData());

qDebug("memory=%s.\n",pStr);

m_pSharedMemory->unlock();

m_pSharedMemory->detach();

}

3.3 参考

http://www.devbean.net/2013/11/qt-study-road-2-ipc/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: