Qt のスレッド プール QThreadPool_fearlazy のブログ - CSDN ブログ
スレッドは、時間のかかる操作を処理してインターフェイスの停止を防ぐのに役立ち、プログラムの同時実行性も向上します。ただし、スレッドの作成、破棄、およびスレッドの切り替えはすべてリソースを消費するため、作成するスレッドの数は多ければ多いほど良いのです。この問題を解決するのがスレッド プールテクノロジの登場です。スレッド プールは一定数のスレッドを維持し、それらを完全に使用します。Qt によってカプセル化されたスレッド プール クラスは QThreadPool であり、これを使用するには QRunnable が連携する必要があります。使用手順の概要は次のとおりです。
1. QRunnable からクラスを派生し、run() 関数を書き直します。子スレッドによって実行する必要がある作業を run 関数に組み込みます。
2. QThreadPool の start() を呼び出して作業を開始します start のパラメータは、サブクラス化された QRunnable のポインタです。
手順は非常に簡単で、例を書くだけです。
1. QtCreator を使用して、QWidget に基づいて新しいプロジェクトを作成します。
2. QRunnable を継承して、新しいクラス CTask を作成します。そして run 関数を書き換えます
3. ウィジェット内に QThreadPool オブジェクトを作成し、それを使用して 10 個のタスクを開始します。
操作結果:
新しく作成されたタスクが子スレッドで実行されていることがわかります。それは嬉しいことですが、何かが間違っているようですか?重複したスレッドがいくつかあります。はい。このスレッド プールのスレッドの最大数は 4 であるためです。スレッドの最大数は setMaxThreadCount で設定できます。
setAutoDelete(false) を使用しない限り、スレッド プールはタスクの実行後にタスク オブジェクト (開始時の CTask new) を自動的に削除します。QRunnable は、実行以外でこれを実行することしかできません。下の写真が証拠です。
最後に言及する点は、Qt は QApplication ごとにスレッド プール オブジェクトを作成し、このオブジェクトは QThreadPool の静的メンバー関数 globalInstance() を通じて取得できることです。安心して手に取って使ってください、何か問題があっても私は責任を負いません。
各パラメータについて詳しく説明した別の記事: