4

目前,我在将 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在这种多线程情况下,内部的隐式共享如何表现。

任何帮助,将不胜感激。

问候

4

1 回答 1

5

a) 注册元类型 QVector。app.exec()在您的主要功能之前添加此行:

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

没有这个 QueuedConnection 将无法工作。

Qt::QueuedConnection b)如果您在连接后执行 moveToThread ,则明确说明您的信号和插槽是通过连接的,这应该可以在正确的线程中修复插槽执行。

于 2012-05-23T12:17:19.337 回答