ボタンクリック時の GUI スレッドでの計算を避けるために、別のスレッドで実行しようとしています。
進行状況を監視する機能が必要になるとすぐに、私のコードはこのソースに基づいています。
だから、私のコードは次のとおりです。
futureWatcher.setFuture(QtConcurrent::mapped(library_pool.cbegin(), library_pool.cend(), util->loadFilesInLibrary(library_pool)));
futureWatcher.waitForFinished();
table = QFuture::result();
これは、qt docs の特定のソースに非常に似ていますが、対応するエラーが発生します。
C2893: Failed to specialize function template 'QFuture<QtPrivate::MapResultType<void,MapFunctor>::ResultType> QtConcurrent::mapped(Iterator,Iterator,MapFunctor)'
C2780: 'QFuture<QtPrivate::MapResultType<void,MapFunctor>::ResultType> QtConcurrent::mapped(const Sequence &,MapFunctor)': expects 2 arguments - 3 provided
C2955: 'QFuture': use of class template requires template argument list
'QFuture<T>::result': illegal call of non-static member function
button_clicked
では、 GUI を作成せずにスロット 内の非 GUI クラスの関数をワーカー スレッドに適切に設定するにはどうすればよいでしょうか。
UPD
さて、今のところコードのコンパイルに成功しました。これがどのように機能するかです。
futureWatcher.setFuture(QtConcurrent::run(&this->util, &Utils::loadFilesInLibrary, library_pool.at(0)));
futureWatcher.waitForFinished();
library_pool = future.result();
ただし、ボタンをクリックすると、実行時にエラーが発生します。
実行しようとしている関数はウィジェットを生成しないため、このメッセージの理由は不明です。
すべてのコードが機能すると述べられているいくつかの質問 (このmain()
ような) を読みましたが、それは私のニーズからかけ離れた場所にのみ存在します。では、GUI スレッドから起動するにはどうすればよいでしょうか。