如何将progressText从QtConcurrent :: run函数(或类似函数)传递给QFutureWatcher?

时间:2014-05-02 22:45:01

标签: c++ qt qt5 progress qtconcurrent

如果我使用QtConcurrent::run启动某个函数进行异步执行,并且使用QFutureWatcher监视返回的未来,那么如果我可以做任何异步执行函数来传达一些进度文本,该怎么办呢?会导致QFutureWatcher发出progressTextChanged信号吗?

即我想要做的是 之类的事情:

void fn() {
  ???->setProgressText("Starting);
  ...
  ???->setProgressText("halfway");
  ...
  ???->setProgressText("done!");
}

QFutureWatcher watcher;
connect(&watcher, SIGNAL(progressTextChanged(const QString&)), &someGuiThing, SLOT(updateProgress(const QString&)));
connect(&watcher, SIGNAL(finished(), &someGuiThing, SLOT(doStuff()));
QFuture<void> future=QConcurrent::run(fn);
watcher.setFuture(future);

然而大问题,QtConcurrent :: run documentation明确说明

  

请注意,QtConcurrent :: run()返回的QFuture 不支持   取消,暂停或进度报告。 QFuture返回了可以   仅用于查询运行/完成状态和返回   功能的价值。

那么我能做的最简单的事情是什么能让我获得与上述功能相同的功能?我是否必须放弃QtConcurrent::runQFuture?都? (然后回到QThread并排队连接?)

1 个答案:

答案 0 :(得分:2)

QtConcurrent::mappedReduced()等QtConcurrent函数返回的QFuture具有progressValue(),progressMinimum(),progressMaximum()和progressText()函数提供的进度信息。与QtConcurrent::run()不同,它不会自动提供这样的东西。

QtConcurrent::run()不会像QtConcurrent::mappedReduced()那样自动提供进度信息。但是您可以使用信号拥有自己的进度报告机制。我不认为还有其他方法可以直截了当。