Передача QVector<float> из рабочего потока в основной поток через сигнал / слот

В настоящее время у меня есть некоторые проблемы при передаче QVector между потоками. На данный момент у меня есть основной поток (GUI-поток) и рабочий поток, который часто генерирует массивы 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
}

Поток запускается с помощью moveToThread QObject и QVector<float> зарегистрирован в мета-системе qRegisterMetaType< QVector<float> >("QVector<float>"); в основном методе.

Возможно ли потерять данные после Pipeline::process возвращается? Я не уверен, как неявное разделение внутри QVectorведет себя в этом многопоточном случае.

Любая помощь будет оценена.

Привет

волк

1 ответ

Решение

А) Зарегистрировать метатип QVector. Добавить эту строку перед app.exec() в вашей основной функции:

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

Без этого QueuedConnection не будет работать.

б) явно сказать, что ваш сигнал и слот подключены через Qt::QueuedConnectionесли вы делаете moveToThread после подключения, это должно исправить выполнение слота в соответствующем потоке.

Другие вопросы по тегам