我有以下问题。我在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()方法,但没有任何帮助。它可以在不释放的情况下工作,在尝试释放它时会崩溃。
答案 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);
}