Qt进程间通信IPC

Qt进程间通信IPC

[email protected]

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,应用)