Qt 与外部exe进程间通信-共享内存

一、进程间通信的方法:

本质上就是建立联系。分为消息传递(比如通过操作系统的消息机制,把进程1的消息传递给进程2)。另一种是共享存储区域(比如共享内存,读写同一个磁盘文件,数据库表等等)。消息传递在我看来暂时只知道是通过操作系统的消息机制来实现的,而操作系统的消息机制内容较多(参考文献:Windows消息机制 )。共享存储区域或文件的关键就是共享同一个文件,同时需要做到不断的访问,或者其他方式来判断(还不清楚,只会用不断访问的方法)。

二、共享内存方法简单介绍

1、基于Qt的QSharedMemory类 

参考文档:QSharedMemory类

2、步骤:

进程A

建立或分配共享内存,设置唯一的key来是识别该共享内存(该key会唯一标识一段共享内存,其背后的原理和操作系统的共享内存机制有关,并且不同的系统,其销毁共享内存的条件也不一样)。

锁定共享内存,进行写入操作。

解锁共享内存。

进程B

通过给QShareMemory的对象设置于进程A一样的key来建立联系,实现共享同一内存。

attach()到该共享内存,并且锁定共享内存,进行读入操作。

解锁共享内存,并detach()该共享内存。

 

释放共享内存--在window系统下,detach()函数在最后一个进程下会释放内存。

参考文档:QSharedMemory 共享内存 进程间通信

三、代码实现

进程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();

}


 

 

你可能感兴趣的:(Qt)