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

В настоящее время у меня проблемы с передачей 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
}

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

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

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

Привет

Волк


person DerHandwerk    schedule 23.05.2012    source источник


Ответы (1)


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

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

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

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

person Raiv    schedule 23.05.2012
comment
Привет, спасибо за ответ. У меня уже есть qRegisterMetaType<QVector<float> >("QVector<float>") в моей основной функции, просто забыл выложить. Я добавил Qt::QueuedConnection, как вы и сказали, но он все еще искажен :-(. - person DerHandwerk; 23.05.2012
comment
Странно - qt копирует данные, если используется соединение с очередью, поэтому у вас должна быть копия вектора, даже если вы вышли из области видимости ... Вы уверены, что вектор содержит правильные данные перед отправкой, и ничто другое в вашем коде не нарушает память? - person Raiv; 23.05.2012
comment
Хм, я только что понял, что без привязки vtk к моему проекту это соединение работает нормально. Очень-очень странно ... :-D. - person DerHandwerk; 23.05.2012