QT进程间共享内存传输图像
一、QShareMemory共享内存
在瑞芯微绿126中使用rtsp取流做算法检测时发现取流不能达到实时状态,参考大神做法将图像数据写入共享内存。
二、QShareMemory封装
1.头文件
#ifndef SHAREDMEMORY_H
#define SHAREDMEMORY_H
#include <QSharedMemory>
enum eSmodel
{
esWrite = 0,
esRead
};
class SharedMemory
{
public:
SharedMemory();
~SharedMemory();
void init(eSmodel eModel);
bool createBuff(int nSize);
void writeData(char* data,int nSize);
bool readData(char* data,int nSize);
void detach();
private:
QSharedMemory m_Shmemory;
eSmodel m_eSmodel;
int m_nBuffSize;
bool m_bAttach;
};
#endif // SHAREDMEMORY_H
2.cpp文件
#include "sharedmemory.h"
#include <QDebug>
SharedMemory::SharedMemory()
:m_bAttach(false)
{
}
SharedMemory::~SharedMemory()
{
}
void SharedMemory::init(eSmodel eModel)
{
m_Shmemory.setKey("imgshare");
m_eSmodel = eModel;
}
bool SharedMemory::createBuff(int nSize)
{
bool isOK =false;
isOK = m_Shmemory.create(nSize, QSharedMemory::ReadWrite);
if (!isOK)
{
qDebug()<<"create shm failed.";
}
else
{
m_nBuffSize = nSize;
}
return isOK;
}
void SharedMemory::writeData(char* data,int nSize)
{
m_Shmemory.lock();//上锁
char *shm_addr = (char *)m_Shmemory.data();//获取共享内存映射首地址
if(shm_addr != NULL)
{
memcpy(shm_addr, data, nSize);//写入数据, 这里注意写入的数据长度不能超过共享内存的大小
}
else {
printf("*******shm_addr = NULL******:%f\n");
}
m_Shmemory.unlock();//解锁
qDebug()<<"writeData OK";
}
bool SharedMemory::readData(char* data,int nSize)
{
if(!m_Shmemory.isAttached())
{
m_bAttach =m_Shmemory.attach(QSharedMemory::ReadOnly);
qDebug() << "m_pSharedMemory attach = " << m_bAttach;
return false;
}
if(m_bAttach)
{
m_Shmemory.lock();//加锁
memcpy(data, m_Shmemory.constData(), nSize/*qMin(m_nBuffSize,nSize)*/);
m_Shmemory.unlock();//解锁
return true;
}
return false;
}
void SharedMemory::detach()
{
m_Shmemory.detach();
}
总结
由不同入口进入启动取流进程和读取图像进行算法处理的进程。