Qt进程间通信IPC
2014-10-25 12:07
225 查看
Qt进程间通信IPC
sf2gis@163.com
2014年8月29日
由于共享内存是由操作系统实际完成的,因此不同的操作系统实际上提供不同的方法。
Qt对不同的系统提供了统一封装,但是如果不在Qt应该程序中使用,则应该使用原始方式(读写应该使用相同的方式),这样才能在非Qt应用程序中使用(与非QT交互时,只能使用原始方式,因为QT会对Key进行改变)。
参考:http://www.devbean.net/2013/11/qt-study-road-2-ipc/
http://hi.baidu.com/mikenoodle/item/06b069869bec6ccdee083d71
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();
}
2) 调用attach进行连接
3) 使用时加锁、解锁
4) 直接转换内存
5) 解除连接
6) 释放内存对象
示例:
}
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/相关文章推荐
- Qt 进程间通信(IPC)
- Qt之进程间通信(IPC)
- Qt 进程间通信(IPC)
- 【Qt】Qt之进程间通信(IPC)【转】
- Qt 进程间通信(IPC)
- Qt 进程间通信(IPC)
- Qt之进程间通信(IPC)
- Qt之进程间通信(IPC)
- 进程间通信(IPC)——信号量、共享内存、消息队列
- Android进程间通信(IPC)
- IPC-进程间通信-套接字
- [转]Android进程间通信--消息机制及IPC机制实现
- 利用AIDL来实现由Binder进行进程间通信(IPC)
- QT的进程间通信
- IPC之 - 使用微软消息队列实现C#进程间通信
- Linux环境编程之IPC进程间通信(四):管道和FIFO比较
- IPC之 - C#中用WM_COPYDATA SendMessage 进程间通信
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
- 深入理解进程间通信(IPC)
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析