使用 QFuture 更新 QProgressDialog

Posted

技术标签:

【中文标题】使用 QFuture 更新 QProgressDialog【英文标题】:Updating a QProgressDialog with a QFuture 【发布时间】:2009-12-10 15:13:09 【问题描述】:

主 GUI 线程在等待 QFuture 时更新 QProgressDialog 的正确方法是什么。具体来说,这个循环中发生了什么:

QProgressDialog pd(...);
QFuture f = ...;

while (!f.isFinished()) 
  pd.setValue(f.progressValue());

  // what goes here?

现在我有一个类似 sleep() 的调用,但这不是最佳的(当然会引入一些 GUI 延迟)。

如果我什么都不放,主线程将循环极点 pd.setValue(),浪费 CPU 周期。

我希望放置类似 QCoreApplication::processEvents(flags,maxtime) 的东西,但如果事件队列为空,它会立即返回。我想要一个等到 maxtime 或者即使队列为空的版本。这样,我得到了延迟,并且主线程始终准备好响应 GUI 事件。

【问题讨论】:

【参考方案1】:

使用QFutureWatcher 使用信号和槽来监控 QFuture 对象。

QFutureWatcher watcher;
QProgressDialog pd(...);
connect(&watcher, SIGNAL(progressValueChanged(int)), &pd, SLOT(setValue(int)));
QFuture f = ...
watcher.setFuture(f);

【讨论】:

很好的答案 TimW。仅供参考,您在connect(watcher, ...); 中的watcher 前面是否缺少&

以上是关于使用 QFuture 更新 QProgressDialog的主要内容,如果未能解决你的问题,请参考以下文章

在取消线程上使用 QFuture 释放内存

分配给运行 QFuture

QFuture 内存泄漏

QFuture 无法为位于不同线程中的父级创建子级

Qt多线程:QtConcurrent + QFuture + QFutureWatcher

阻塞 QFuture.result() 或 QFutureWatcher.waitForFinished();