Как отобразить QtConcurrent в QList QVector & lt; double & gt; и уменьшить в один QVector

Я действительно пытался объединить все, что я знаю, чтобы сделать эту работу. Я полагаю, что не будет никаких проблем с тупиком или другими проблемами потока в текущей структуре. Тем не менее, некоторые части отсутствуют, и доступная документация мне не помогает (у меня нет опыта в документации по 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()я даю правильные аргументы?
  • Как насчет возврата функций, как они должны быть отсортированы?
  • Что именно нужно включить, мне просто нужно включить 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»

Это то же самое, что рабочая вещь в консольном приложении.

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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]