0

ボタンクリック時の 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 スレッドから起動するにはどうすればよいでしょうか。

4

1 に答える 1