Если я запускаю какую-то функцию для асинхронного выполнения, используя 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 документация четко указывает
Обратите внимание, что QFuture, возвращаемый QtConcurrent::run(), не поддерживает отмену, приостановку или отчеты о ходе выполнения. Возвращенный QFuture может использоваться только для запроса статуса выполнения/завершения и возвращаемого значения функции.
Итак, что самое простое, что я могу сделать, что даст мне что-то функционально эквивалентное тому, что пытается сделать выше? Должен ли я отказаться от QtConcurrent::run
? QFuture
? Оба? (И вернуться к QThread
и соединениям в очереди?)