【问题标题】:QtConcurrent blockingMappedReduced v.s MappedReducedQtConcurrent blockingMappedReduced 与 MappedReduced
【发布时间】:2016-11-08 05:24:45
【问题描述】:

据我了解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?请指教。

【问题讨论】:

标签: c++ qt qtconcurrent


【解决方案1】:

在示例中,QFuture 对象使用 QFuture 对象的 conversion operator to its template parameter type 直接返回到 WordCount,后者阻塞并等待结果可用。

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

实际上,调用阻塞版本的函数blockingMappedReduced或从异步mappedReduced返回QFuture对象并立即阻塞返回的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

【讨论】:

  • 你能再解释一下什么转换运算符吗?我阅读了文档,但没有找到任何解释。 @talamaki
  • 您可以定义一个类的成员函数,称为转换函数,将其类的类型转换为另一种指定的类型。
  • 更多详情请见this
  • 你能解释一下future.isResultReadyAt(0)是什么意思吗? @talamaki
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多