Qt Concurrent
Qt Concurrent モジュールは、ミューテックス、読み書きロック、待機条件、セマフォなどの低レベルのスレッドプリミティブを使用せずにマルチスレッドプログラムを記述することを可能にする高レベル API を提供する。Qt Concurrent で書かれたプログラムは、利用可能なプロセッサ・コア数に応じて、使用するスレッド数を自動的に調整する。つまり、現在書かれているアプリケーションは、将来マルチコアシステムにデプロイされても拡張し続けることができる。
Qt Concurrent には、共有メモリ(非分散)システム用のMapReduceとFilterReduceの実装や、GUIアプリケーションの非同期計算を管理するためのクラスを含む、並列リスト処理のための関数型プログラミングスタイルのAPIが含まれている:
- コンカレントMapとMap-Reduce
- QtConcurrent::map() は、コンテナ内のすべてのアイテムに関数を適用し、アイテムをインプレースで変更する。
- QtConcurrent::mapped() は map() に似ているが、修正された新しいコンテナを返す点が異なる。
- QtConcurrent::mappedReduced()はmapped()と似ているが、修正された結果が縮小されるか、1つの結果に折り畳まれる点が異なる。
- 並行フィルタとフィルタ削減
- QtConcurrent::filter() は、フィルタ関数の結果に基づいてコンテナからすべての項目を削除します。
- QtConcurrent::filtered() は filter() と同じですが、フィルタリングした結果を新しいコンテナとして返す点が異なります。
- QtConcurrent::filteredReduced() は filter() と似ていますが、フィルタリングされた結果が縮小または折りたたまれて 1 つの結果になる点が異なります。
- 同時実行
- QtConcurrent::run() は、別のスレッドで関数を実行します。
- 同時実行タスク
- QtConcurrent::task() は、QtConcurrent::QTaskBuilder のインスタンスを作成します。 このオブジェクトは、パラメータを調整したり、別のスレッドでタスクを開始したりするために使用できます。
- QFuture は、非同期計算の結果を表します。
- QFutureIterator QFuture を介して利用可能な結果を反復処理できます。
- QFutureWatcher シグナル・アンド・スロットを使って を監視することができる。QFuture
- QFutureSynchronizer は、複数のQFutureを自動的に同期させる便利なクラスです。
- QPromise 非同期計算の進捗と結果を に報告する方法を提供します。 から要求があった場合、タスクを中断またはキャンセルできるようにします。QFuture QFuture
Qt Concurrent 複数の STL 互換コンテナとイテレータ型をサポートしますが、 のようなランダムアクセス・イテレータを持つ Qt コンテナで最もよく機能します。map関数とfilter関数は、コンテナとbegin/endイテレータの両方を受け入れます。QList
STL イテレータサポートの概要
イテレータ型 | クラス例 | サポート状況 |
---|---|---|
入力イテレータ | 未サポート | |
出力イテレータ | 未サポート | |
順方向イテレータ | 標準::スリスト | サポートあり |
双方向イテレータ | 標準::リスト | サポート |
ランダムアクセス反復子 | QListstd::vector | サポートおよび推奨 |
ランダムアクセス・イテレータは、Qt Concurrent 、コンテナ内の任意のポイントにスキップできるため、大量の軽量アイテムを反復処理する場合に高速化できる。さらに、ランダムアクセス・イテレータを使用することで、QFuture::progressValue() やQFutureWatcher::progressValueChanged() を通じてQt Concurrent に進捗情報を提供することができる。
mapped()やfiltered()などの非インプレイス変更関数は、呼び出されるとコンテナのコピーを作成します。STL コンテナを使用している場合、このコピー処理に時間がかかることがあります。このような場合は、代わりにコンテナの開始イテレータと終了イテレータを指定することをお勧めします。
モジュールの使用
Qt モジュールを使用するには、モジュール・ライブラリを直接、または他の依存関係を通してリンクする必要があります。CMakeや qmakeなど、いくつかのビルドツールはこのための専用サポートを持っています。
CMakeでビルドする
find_package()
コマンドを使って、Qt6
パッケージの中から必要なモジュールコンポーネントを探します:
find_package(Qt6 REQUIRED COMPONENTS Concurrent) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
CMakeによるビルドの概要も参照してください。
qmakeでビルドする
モジュールをqmakeでビルドするように設定するには、プロジェクトの.proファイルにQT
変数の値としてモジュールを追加します:
QT += concurrent
例
モジュールの進化
Qt Concurrent の変更点には、Qt 6 シリーズの Qt で行われたモジュールの API と機能の重要な変更点が記載されています。
ライセンス
Qt Concurrent モジュールはThe Qt Company の商用ライセンスで利用できます。さらに、フリーソフトウェアライセンスでも利用可能です:GNU Lesser General Public License, version 3, またはGNU General Public License, version 2.詳細はQt ライセンスを参照してください。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.