访问违规QT PostEvent

时间:2016-09-02 09:17:11

标签: c++ multithreading qt video frame

我有以下问题。我在DLL中的非GUI线程中接收视频帧。我想在QT应用程序中显示这些内容。所以我创建了一个像这样的QEvent子类:

class FrameEvent : public QEvent
{
public:
    FrameEvent() : QEvent(QEvent::Type::User) {}

    ~FrameEvent() 
    { 
        free(buffer);
    }
    unsigned char * buffer;
};

然后我为每个帧执行此操作:

void frameCallback(unsigned char *buffer)
{
    int size = 1024 * 768 * 4;
    FrameEvent * ev = new FrameEvent();
    ev->buffer = (unsigned char*)malloc(size);
    memcpy(ev->buffer,buffer, size);

    QCoreApplication::postEvent(app, (QEvent*)ev);
}

并处理该事件。如果我不尝试释放()析构函数中的帧,一切都有效,但当然我的内存很快耗尽。我也尝试在其他地方释放缓冲区,比如event()方法,但没有任何帮助。它可以在不释放的情况下工作,在尝试释放它时会崩溃。

1 个答案:

答案 0 :(得分:1)

您的代码“很好”。这是C和C ++的可怕组合,但它不是问题的根源。我就是这样做的:

// interface
class FrameEvent : public QEvent
{
    Q_DISABLE_COPY(FrameEvent)
    static const QEvent::Type m_type;
    QByteArray m_data;
public:
    FrameEvent(const QByteArray & data);
    FrameEvent(QByteArray && data);
    const QByteArray & data() const { return m_data; }
    const uchar * dataPtr() const { return (const uchar*)m_data.constData(); }
};

// implementation
const QEvent::Type FrameEvent::m_type = (QEvent::Type)QEvent::registerEventType();

FrameEvent::FrameEvent(const QByteArray &data) :
    QEvent{m_type},
    m_data{data}
{}

FrameEvent::FrameEvent(QByteArray &&data) :
    QEvent{m_type},
    m_data{std::move(data)}
{}

void frameCallback(const uchar * buffer)
{
    int size = 1024 * 768 * 4;
    auto event = new FrameEvent{{(const char*)buffer, size}}; // uniform initialization
    QCoreApplication::postEvent(qApp, event);
}