multithreading - 可以取消并报告进度的QFuture

标签 multithreading qt qtconcurrent qfuture

QFuture类具有诸如cancel()progressValue()等方法。这些方法显然可以通过QFutureWatcher进行监视。但是,QtConcurrent::run()的文档为:

Note that the QFuture returned by QtConcurrent::run() does not support canceling, pausing, or progress reporting. The QFuture returned can only be used to query for the running/finished status and the return value of the function.



我徒劳地寻找哪种方法实际上可以创建一个可以取消的QFuture并为一个长时间运行的操作报告进度。 (看起来QtConcurrent::map()和类似的函数可能可以,但是我只有一个长期运行的方法。)

(对于熟悉.Net的人,类似于BackgroundWorker类。)

有哪些可用选项?

最佳答案

对于长期运行的单个任务, QThread 可能是您最好的选择。它没有内置的进度报告或取消功能,因此您必须自己动手。但是对于简单的进度更新,它并不难。要取消任务,请检查可以在任务循环中调用线程设置的标志。

需要注意的一件事是,如果您重写QThread::run()并将任务放在此处,则无法从那里发出信号,因为QThread对象不是在运行它的线程内创建的,并且您不能从运行线程中提取QObject。这个issue有一个不错的文章。

关于multithreading - 可以取消并报告进度的QFuture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423058/

相关文章:

c++ - Qt Concurrent 或 std::async 用于新代码?

QtConcurrent::blockingMapped 调用函数具有超过 1 个参数

java - 通过 InvokeLater 的多个动画 - Java

c - 如何在线程中等待信号?

python - 了解 python GIL - I/O 绑定(bind)与 CPU 绑定(bind)

qt - 在qt中的样式表中自定义选项卡控件

qt - 我想创建一个小的工具来录制音频,在录制过程中,录制过程中会产生很多额外的噪音

Java 网络 - 在同一线程中的不同端口上并行启动多个服务器套接字

sql-server-2008 - 如何使用 qt 连接到 SQL Server 2008?

c++ - 如何使用 QtConcurrent::run 调用以指针为参数的非类成员函数?