QT进程间共享内存

该博客介绍了如何在瑞芯微平台利用QT的QSharedMemory类实现进程间共享内存来传输图像数据,以提高实时性。首先,概述了在rtsp取流中遇到的实时性问题,然后详细讲解了QSharedMemory的使用,包括创建共享内存、写入和读取数据的方法,并提供了封装的头文件和cpp文件实现。最后,提到了不同进程如何通过共享内存进行图像数据的交换。
摘要由CSDN通过智能技术生成


一、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();
}

总结

由不同入口进入启动取流进程和读取图像进行算法处理的进程。

Qt共享内存是一种实现进程通信的机制。进程通信通常用于在不同的进程交换数据。共享内存就是将一块内存空映射到多个进程的地址空中,使得多个进程可以直接访问这块内存空Qt提供了QSharedMemory类来实现共享内存。 使用Qt共享内存进行进程通信的步骤如下: 1. 创建一个QSharedMemory对象,并指定共享内存的唯一标识符。 2. 调用create()函数来创建共享内存,如果共享内存已经存在,则直接打开。 3. 调用attach()函数将共享内存映射到当前进程的地址空中。 4. 使用writeData()函数向共享内存中写入数据。 5. 使用readData()函数从共享内存中读取数据。 6. 使用detach()函数将共享内存从当前进程的地址空中解除映射。 7. 使用destroy()函数销毁共享内存。 通过这种方式,多个进程可以通过共享内存来交换数据,而无需通过消息传递等方式进行繁琐的数据传输。这样可以提高进程通信的效率,减少系统资源的占用。 需要注意的是,共享内存的使用需要保证互斥性,避免多个进程同时对共享内存进行写操作导致数据混乱。可以使用QMutex等同步机制来解决这个问题。 总之,Qt共享内存提供了一种高效的进程通信方式,使得多个进程可以方便地进行数据交换。可以广泛应用于需要实现进程数据共享的场景,如多进程协同处理、进程数据传递等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值