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/