如何在QVector的QList上映射QtConcurrent <double>并减少为一个QVector </double>

时间:2013-09-01 14:09:06

标签: c++ qt qtconcurrent

我真的试图结合我所知道的一切来完成这项工作。我相信当前结构中的死锁或其他线程问题不会有问题。但是,缺少一些部分,可用的文档对我没有帮助(我没有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的输入,我想进入一个向量,每个向量都添加了一些迭代变量。 我希望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);

Var: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”

它与控制台应用程序中的工作内容相同。

1 个答案:

答案 0 :(得分:2)

是的QtConcurrent文档很糟糕。 Here is更好地描述了应该如何使用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版本。