Я действительно пытался объединить все, что я знаю, чтобы сделать эту работу. Я полагаю, что не будет никаких проблем с тупиком или другими проблемами потока в текущей структуре. Тем не менее, некоторые части отсутствуют, и доступная документация мне не помогает (у меня нет опыта в документации по 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;
}
Из ввода QList, содержащего 3 вектора со всеми, я хотел бы перейти к одному вектору, для которого каждый вектор добавил некоторую переменную итерации.
Я ожидаю в результате в 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»
Это то же самое, что рабочая вещь в консольном приложении.
Да, документация по 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.
Других решений пока нет …