我真的试图结合我所知道的一切来完成这项工作。我相信当前结构中的死锁或其他线程问题不会有问题。但是,缺少一些部分,可用的文档对我没有帮助(我没有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()
怎么样,我给出了正确的论点?虽然它适用于我的例子,但当我使用它时会出现什么问题:
窒息: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”
它与控制台应用程序中的工作内容相同。
答案 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版本。