5

を使用して非同期実行用の関数を起動し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ドキュメントには明確に記載されています

QtConcurrent::run() によって返される QFuture は 、キャンセル、一時停止、または進行状況レポートをサポートしていないことに注意してください。返された QFuture は、実行中/終了ステータスと関数の戻り値を照会するためにのみ使用できます。

では、上記がやろうとしていることと機能的に同等のものを得るために私ができる最も簡単なことは何ですか? 放棄しなければなりQtConcurrent::runませんか?QFuture? 両方?(そしてQThread、キューに入れられた接続に戻りますか?)

4

2 に答える 2

2

QtConcurrent 関数によって返される QFuture にQtConcurrent::mappedReduced()は、progressValue()、progressMinimum()、progressMaximum()、および progressText() 関数によって提供される進捗情報があります。QtConcurrent::run()そのようなことを自動的に提供しないものとは異なります。

QtConcurrent::run()のように自動的に進捗情報を提供しませんQtConcurrent::mappedReduced()。ただし、シグナルを使用して独自の進行状況報告メカニズムを持つことができます。これほど簡単な方法は他にないと思います。

于 2014-05-03T03:43:23.837 に答える