通过signal / slot </float>将QVector <float>从工作线程传递到主线程

时间:2012-05-23 12:05:43

标签: multithreading qt signals-slots qthread

目前我有一些麻烦将QVector传递给线程。目前我有一个主线程(GUI-Thread)和一个频繁发出QVector数组的工作线程。直接在向量内部发射数据之前看起来很好。接收器是主线程中的一个插槽,但插槽接收的数据是乱码。

以下是我的代码的一些部分:

在工作线程中发出:

void Pipeline::process
{
    QVector<float> buffer(w * h * d);

    // filling the vector with RGB-Values

    emit this->pushBuffer(buffer, w, h, d);
}

主线程中信号和插槽的连接:

QObject::connect(this->_pipeline.data(), SIGNAL(pushBuffer(const QVector<float>, int, int, int)), this->ui->widgetFiltered, SLOT(setBuffer(const QVector<float>,int,int,int)));

主线程中的插槽:

void GLWidget::setBuffer(const QVector<float> buffer, int dataSizeX, int dataSizeY, int dataSizeZ)
{
    // at this point the contents inside 'buffer' is garbled
}

使用QObject的moveToThread启动线程,并在main方法中通过QVector<float>向元系统注册qRegisterMetaType< QVector<float> >("QVector<float>");

Pipeline::process返回后数据是否可能丢失?我不确定QVector内的隐式共享在这个多线程的情况下是如何表现的。

任何帮助都将不胜感激。

问候

1 个答案:

答案 0 :(得分:5)

a)注册元类型QVector。在主函数中的app.exec()之前添加此行:

qRegisterMetaType<QVector<float> >("QVector<float>");

如果没有此QueuedConnection将无效。

b)明确说明您的信号和广告位是通过Qt::QueuedConnection连接的 如果你在连接后执行moveToThread,这应该在适当的线程中修复插槽执行。