QtConcurrent blockingMappedReduced 与 MappedReduced

Posted

技术标签:

【中文标题】QtConcurrent blockingMappedReduced 与 MappedReduced【英文标题】:QtConcurrent blockingMappedReduced v.s 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?请指教。

【问题讨论】:

我猜示例代码使用the implicit conversion of QFuture to its underlying type 与调用WordCount total = QtConcurrent::mappedReduced(files, countWords, reduce).result(); 相同 【参考方案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

以上是关于QtConcurrent blockingMappedReduced 与 MappedReduced的主要内容,如果未能解决你的问题,请参考以下文章

QtConcurrent 运行的线程 id

QtConcurrent blockingMappedReduced 与 MappedReduced

QtConcurrent 与索引映射

QtConcurrent::run 发出信号

如何设置 QTConcurrent 操作的最大线程数?

使用 QtConcurrent::run() 修改成员变量?