一、进程间通信的方法:
本质上就是建立联系。分为消息传递(比如通过操作系统的消息机制,把进程1的消息传递给进程2)。另一种是共享存储区域(比如共享内存,读写同一个磁盘文件,数据库表等等)。消息传递在我看来暂时只知道是通过操作系统的消息机制来实现的,而操作系统的消息机制内容较多(参考文献:Windows消息机制 )。共享存储区域或文件的关键就是共享同一个文件,同时需要做到不断的访问,或者其他方式来判断(还不清楚,只会用不断访问的方法)。
二、共享内存方法简单介绍
1、基于Qt的QSharedMemory类
参考文档:QSharedMemory类
2、步骤:
进程A
建立或分配共享内存,设置唯一的key来是识别该共享内存(该key会唯一标识一段共享内存,其背后的原理和操作系统的共享内存机制有关,并且不同的系统,其销毁共享内存的条件也不一样)。
锁定共享内存,进行写入操作。
解锁共享内存。
进程B
通过给QShareMemory的对象设置于进程A一样的key来建立联系,实现共享同一内存。
attach()到该共享内存,并且锁定共享内存,进行读入操作。
解锁共享内存,并detach()该共享内存。
释放共享内存--在window系统下,detach()函数在最后一个进程下会释放内存。
三、代码实现
进程A
//方法:共享内存的方法。
if (NULL == m_pRkWebViewSharedMemory)
{
m_pRkWebViewSharedMemory = new QSharedMemory();
QString qstrNativeKey = QString("RkWebViewModelSM");
m_pRkWebViewSharedMemory->setNativeKey(qstrNativeKey);
}
// 判断该sm对象是否attch()该内存,是就解除
if (m_pRkWebViewSharedMemory->isAttached())
{
m_pRkWebViewSharedMemory->detach();
}
//写入共享内存数据
char *from = qstrId.toLocal8Bit().data();
m_pRkWebViewSharedMemory->create(qstrId.toLocal8Bit().size());
m_pRkWebViewSharedMemory->lock();
char *to = (char*)m_pRkWebViewSharedMemory->data();
memcpy(to ,from ,qstrId.toLocal8Bit().size());
m_pRkWebViewSharedMemory->unlock();
进程B
//定时器的槽函数:实现不断读取共享内存,以判断共享内存是否有新数据
void slotScanningSharedMemory()
{
if (NULL == m_pSharedMemory)
{
m_pSharedMemory = new QSharedMemory();
QString qstrNativeKey = QString("RkWebViewModelSM");
m_pSharedMemory->setNativeKey(qstrNativeKey);
}
//先让sm对象attch()到共享内存
if (!m_pSharedMemory->attach(QSharedMemory::ReadOnly))
{
//QMessageBox::information(this, "", "attach failed!");
return;
}
//从共享内存中读取数据
m_pSharedMemory->lock();
QByteArray buffer;
buffer.setRawData((char*)m_pSharedMemory->data(), m_pSharedMemory->size());
QString qstrHouseId = QString(buffer);
m_pSharedMemory->unlock();
//解除attch
m_pSharedMemory->detach();
}