4

現在、スレッド間で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
}

スレッドは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 に答える