如何将来自 QtConcurrent::run 函数(或类似函数)的进度文本传递给 QFutureWatcher?

tim*_*day 7 c++ qt progress qtconcurrent qt5

如果我使用 启动一些用于异步执行的函数QtConcurrent::run,并使用 a 监视返回的 future QFutureWatcher,那么如果我可以在该异步执行函数中执行一些操作来传达一些进度文本,这将导致触发QFutureWatcherprogressTextChanged信号,该怎么办?

即我想做的是这样的:

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);
Run Code Online (Sandbox Code Playgroud)

然而大问题是,QtConcurrent::run文档明确指出

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

那么,我能做的最简单的事情是什么,它能让我得到与上面试图做的功能相同的东西呢?我必须放弃吗QtConcurrent::runQFuture?两个都?(然后返回QThread并排队连接?)

Nej*_*jat 4

QtConcurrent 函数返回的 QFutureQtConcurrent::mappedReduced()具有由 ProgressValue()、progressMinimum()、progressMaximum() 和 ProgressText() 函数提供的进度信息。与此不同的是QtConcurrent::run(),它不会自动提供这样的东西。

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

  • 是的,这就是我最终要做的:使用带有 QueuedConnection 的 QMetaObject::invokeMethod 将状态消息从并发函数发送到监视其进度的插槽(实际上,BlockingQueuedConnection 似乎会导致更平滑的显示......我发送了很多消息)。有关上下文的更多信息,请访问 http://qt-project.org/forums/viewthread/41012/#174738 (2认同)