2

この作品を作るために、私が知っているすべてを組み合わせようとしました。現在の構造でデッドロックやその他のスレッドの問題は発生しないと思います。ただし、いくつかの部分が欠落しており、利用可能なドキュメントは役に立ちません (私は C++ ドキュメントの経験がありません)。

int main() 
{
    QVector<double> vector_of_doubles(5);
    qFill(vector_of_doubles.begin(), vector_of_doubles.end(), 1);

    QList< QVector<double> > list_of_vectors;
    list_of_vectors.append(vector_of_doubles);
    list_of_vectors.append(vector_of_doubles);
    list_of_vectors.append(vector_of_doubles);

    QFuture< QVector<double> > res; 
    res = QtConcurrent::mappedReduced(list_of_vectors, Map(), Reduce());
    res.waitForFinished();
    qDebug()<<res.result();
    return 0
}

QVector<double> Reduce(QVector<double> vector)
// Here the vectors get combined into one big vector....but how?
{
    ....
    return big_vector;
}

QVector<double> Map(QVector<double> vector)
{
    for (int i = 0; i < vector.size(); i++)
    {
        vector[i] = vector[i] + i;
    }
    return vector;
}

すべてが 1 の 3 つのベクトルを保持する QList の入力から、すべてのベクトルがいくつかの反復変数を追加した 1 つのベクトルに入りたいと思います。結果として、次のことが期待qDebug()できます。

{1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4 ,5}

ここで、私が不足していると思われるものは次のとおりです。

  • についてはどうですかQtConcurrent:mappedReduced()、正しい引数を与えていますか?
  • 関数の戻り値についてはどうですか、これらをどのように整理する必要がありますか?
  • 正確に何を含める必要がありますか? QtConcurrent を含めるだけでよいですか?
  • これが機能し始めると、QtConcurrentがスレッド管理を行い(利用可能なコアを使用する)、リストのすべてのアイテム(サイズが同じでなくても)がスマートに渡されることを理解している限り、リストは巨大になります。スレッドをアイドル状態にしないようにしますか?

編集 (ボタンのクリックで発生するのは問題でしょうか?):

私の例では機能していましたが、これを使用すると何が問題になる可能性がありますか:

チョークオン:res = QtConcurrent::mappedReduced(holder, correlate, Reduce, QtConcurrent::SequentialReduce);

変数:QList< QVector<double> > holder;

関連する機能:

QVector<double> correlate(QVector<double> &var1); 

void Reduce(QVector<double> &reduceResult, const QVector<double> &partial)`

エラー: 呼び出しに一致する関数がありません'mappedReduced(QList<QVector<double> >&, <unresolved overloaded function type>, <unresolved overloaded function type>, QtConcurrent::ReduceOption)'

また、「テンプレート パラメーター ResultType を推測できませんでした」

コンソールアプリで動くものと同じです。

4

1 に答える 1

2

はい、QtConcurrent のドキュメントはよくありません。ここでは、mappedReduced の使用方法についてより適切に説明します。

したがって、reduce 関数は次のようになります。

void joinVectors(QVector<double> &reduceResult, const QVector<double> &partial) {
    reduceResult += partial;
}

データの適切な順序を維持するには、追加の引数を追加する必要があります。

res = QtConcurrent::mappedReduced(list_of_vectors, doSomeMapping, joinVectors, QtConcurrent::SequentialReduce);


テストに使用したコードは次のとおりです(正常にビルドされ、期待される結果が得られます)。

#include <QCoreApplication>
#include <QtConcurrent/QtConcurrent>
#include <QDebug>

QVector<double> addIndexToVector(QVector<double> vector) {
    for (int i = 0; i < vector.size(); i++) {
        vector[i] = vector[i] + i;
    }
    return vector;
}

void joinVectors(QVector<double> &reduceResult, const QVector<double> &partial) {
    reduceResult += partial;
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    QVector<double> vector_of_doubles(20, 0);

    QList< QVector<double> > list_of_vectors;
    list_of_vectors.append(vector_of_doubles);
    list_of_vectors.append(vector_of_doubles);
    list_of_vectors.append(vector_of_doubles);

    QFuture< QVector<double> > res;
    res = QtConcurrent::mappedReduced(list_of_vectors, addIndexToVector, joinVectors);
    res.waitForFinished();
    qDebug()<<res.result();

    return a.exec();
}

プロジェクト ファイル:

QT       += core concurrent
QT       -= gui
TARGET = testApp
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

Qt 5.0.1 Linux バージョンを使用しました。

于 2013-09-01T14:47:31.310 に答える