2016-11-08 13 views
3

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

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

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

+0

Я полагаю, что пример кода использует [неявное преобразование QFuture его базового типа] (http://doc.qt.io/qt-5/qfuture.html#operator-T) который был бы то же самое, что и для вызова 'WordCount total = QtConcurrent :: mappedReduced (файлы, countWords, сокращение) .result();' – Dmitry

ответ

3

В примере QFuture объект возвращается непосредственно к WordCount с использованием QFuture объекта conversion operator to its template parameter type, который блокирует и ожидает, когда результат станет доступным.

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 
+0

Можете ли вы объяснить, какой оператор преобразования немного больше? Я прочитал документацию и не нашел объяснений. @talamaki – ascetic652

+0

Вы можете определить функцию-член класса, называемую функцией преобразования, которая преобразует из типа своего класса в другой указанный тип. – talamaki

+0

См. [Это] (http://stackoverflow.com/questions/1307876/how-do-conversion-operators-work-in-c/) для получения более подробной информации. – talamaki