Передача 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 после подключения, это должно исправить выполнение слота в соответствующем потоке.