QtConcurrent blockingMappedReduced против MappedReduced

Насколько я понимаю, QtConcurrent::blockingMappedReduced возвращает окончательные результаты, тогда как QtConcurrent::MappedReduced возвращает объект QFuture, но в этом примере http://doc.qt.io/qt-5/qtconcurrent-wordcount-main-cpp.html Я видел такой код:

WordCount total = QtConcurrent::mappedReduced(files, countWords, reduce);

QtConcurrent::mappedReduced также возвращает окончательные результаты. Я что-то упускаю? Если это неверно, как правильно использовать результаты, возвращаемые QtConcurrent::mappedReduced? И при каком условии я должен QtConcurrent::mappedReduced вместо QtConcurrent::blockingMappedReduced? Пожалуйста, порекомендуйте.


person ascetic652    schedule 08.11.2016    source источник
comment
Я предполагаю, что этот пример кода использует неявное преобразование QFuture в его базовый тип что было бы то же самое, что вызвать WordCount total = QtConcurrent::mappedReduced(files, countWords, reduce).result();   -  person Dmitry    schedule 08.11.2016


Ответы (1)


В примере объект QFuture возвращается непосредственно в WordCount с помощью оператора преобразования объекта QFuture в тип параметра шаблона, который блокирует и ожидает, пока результат станет доступным.

typedef QMap<QString, int> WordCount;
WordCount total = mappedReduced(files, countWords, reduce);

На практике это то же самое, если вы вызываете блокирующую версию функции blockingMappedReduced или возвращаете QFuture объект из асинхронного mappedReduced и немедленно блокируете возвращенный объект QFuture. Обратите внимание, что вызов result() или resultAt(0) также блокируется.

WordCount total = blockingMappedReduced(files, countWords, reduce);

QFuture<WordCount> future = mappedReduced(files, countWords, reduce);
WordCount total = future.result();

Если вы хотите взаимодействовать с объектом QFuture (пауза, возобновление, проверка готовности результатов), вы можете обрабатывать его асинхронно, вызывая mappedReduced и не используя функции блокировки.

QFuture<WordCount> future = mappedReduced(files, countWords, reduce);
qDebug() << future.isResultReadyAt(0); // returns false
person talamaki    schedule 08.11.2016
comment
Не могли бы вы подробнее объяснить, какой оператор преобразования? Я прочитал документацию и не нашел там объяснений. @talamaki - person ascetic652; 08.11.2016
comment
Вы можете определить функцию-член класса, называемую функцией преобразования, которая преобразует тип своего класса в другой указанный тип. - person talamaki; 08.11.2016
comment
Дополнительные сведения см. В this. - person talamaki; 08.11.2016
comment
Не могли бы вы немного объяснить, что означает future.isResultReadyAt (0)? @talamaki - person ascetic652; 13.11.2016