QThreadPool Class

QThreadPool クラスは、QThreads のコレクションを管理します。詳細...

ヘッダー #include <QThreadPool>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
継承: QObject

メモ:このクラスの関数はすべてスレッドセーフです。

プロパティ

公共機能

QThreadPool(QObject *parent = nullptr)
virtual ~QThreadPool()
int activeThreadCount() const
void clear()
(since 6.0) bool contains(const QThread *thread) const
int expiryTimeout() const
int maxThreadCount() const
void releaseThread()
void reserveThread()
void setExpiryTimeout(int expiryTimeout)
void setMaxThreadCount(int maxThreadCount)
void setStackSize(uint stackSize)
void setThreadPriority(QThread::Priority priority)
uint stackSize() const
void start(QRunnable *runnable, int priority = 0)
void start(Callable &&callableToRun, int priority = 0)
(since 6.3) void startOnReservedThread(QRunnable *runnable)
(since 6.3) void startOnReservedThread(Callable &&callableToRun)
QThread::Priority threadPriority() const
bool tryStart(QRunnable *runnable)
bool tryStart(Callable &&callableToRun)
bool tryTake(QRunnable *runnable)
(since 6.8) bool waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever)
bool waitForDone(int msecs)

静的パブリックメンバ

QThreadPool *globalInstance()

詳細説明

QThreadPool は、スレッドを使用するプログラムのスレッド生成コストを削減するために、個々のQThread オブジェクトを管理し、リサイクルします。各 Qt アプリケーションは 1 つのグローバル QThreadPool オブジェクトを持ち、globalInstance() を呼び出すことでアクセスできます。

QThreadPool スレッドの 1 つを使用するには、QRunnable をサブクラス化し、run() 仮想関数を実装します。次に、そのクラスのオブジェクトを作成し、QThreadPool::start() に渡します。

クラスHelloWorldTask :publicQRunnable
{voidrun() オーバーライド    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
    } }; HelloWorldTask*hello = newHelloWorldTask();// QThreadPoolが所有権を取得し、自動的に'hello'を削除するQThreadPool::globalInstance()->start(hello);

QThreadPool はデフォルトでQRunnable を自動的に削除する。自動削除フラグを変更するには、QRunnable::setAutoDelete() を使用します。

QThreadPool は、QRunnable::run() 内からtryStart(this) を呼び出すことによって、同じQRunnable を複数回実行することをサポートしています。autoDelete が有効な場合、QRunnable は、最後のスレッドが run 関数を終了したときに削除されます。autoDeleteが有効になっているときに、同じQRunnablestart() を複数回呼び出すと、競合状態が発生するためお勧めできません。

一定時間未使用のスレッドは期限切れになります。デフォルトの期限切れタイムアウトは 30000 ミリ秒(30 秒)である。これはsetExpiryTimeout() で変更できる。有効期限切れタイムアウトに負の値を設定すると、有効期限切れメカニズムが無効になります。

maxThreadCount() を呼び出して、使用するスレッドの最大数を問い合わせる。必要に応じて、setMaxThreadCount() を使用して上限を変更できます。デフォルトのmaxThreadCount() はQThread::idealThreadCount() である。activeThreadCount() 関数は、現在作業中のスレッド数を返す。

reserveThread() 関数は、外部使用用にスレッドを予約します。スレッドを再利用できるようにするため、スレッドを使い終わったらreleaseThread() を使用します。基本的に、これらの関数は、アクティブなスレッド数を一時的に増減させ、QThreadPool には見えない時間のかかる処理を実装する場合に便利です。

QThreadPool はスレッドを管理するための低レベルのクラスであることに注意してください。高レベルの代替クラスについてはQt Concurrent モジュールを参照してください。

QRunnableも参照してください

プロパティ・ドキュメント

[read-only] activeThreadCount : const int

このプロパティは、スレッド・プール内のアクティブなスレッド数を保持する。

注意: この関数は、maxThreadCount ()を超える値を返す可能性があります。詳細はreserveThread() を参照。

アクセス関数:

int activeThreadCount() const

reserveThread() およびreleaseThread()も参照して ください。

expiryTimeout : int

このプロパティは、スレッド有効期限タイムアウト値をミリ秒単位で保持する。

expiryTimeoutミリ秒の間使用されなかったスレッドは、期限が切れたとみなされ、終了します。このようなスレッドは必要に応じて再起動される。デフォルトのexpiryTimeout は 30000 ミリ秒(30 秒)である。expiryTimeout が負の場合、新しく作成されたスレッドは期限切れにならない。たとえば、スレッドプールが破棄されるまで終了しない。

expiryTimeout を設定しても、すでに実行中のスレッドには影響しないことに注意してください。新しく作成されたスレッドだけが新しいexpiryTimeout を使用します。スレッド・プールを作成した直後で、start ()を呼び出す前に、expiryTimeout を設定することを推奨する。

アクセス関数:

int expiryTimeout() const
void setExpiryTimeout(int expiryTimeout)

maxThreadCount : int

このプロパティは、スレッド・プールが使用するスレッドの最大数を保持する。このプロパティは、QThreadPool オブジェクトが作成された時点で、デフォルトでQThread::idealThreadCount() の値になります。

注意: maxThreadCount の上限がゼロまたは負の値であっても、スレッド・プールは常に少なくとも 1 つのスレッドを使用します。

デフォルトのmaxThreadCountQThread::idealThreadCount() です。

アクセス関数:

int maxThreadCount() const
void setMaxThreadCount(int maxThreadCount)

stackSize : uint

このプロパティは、スレッド・プールのワーカー・スレッドのスタック・サイズを保持する。

このプロパティの値は、スレッド・プールが新しいスレッドを作成するときにのみ使用されます。この値を変更しても、すでに作成されたスレッドや実行中のスレッドには影響しません。

デフォルト値は 0 で、QThread はオペレーティング・システムのデフォルトのスタック・サイズを使用します。

アクセス関数:

uint stackSize() const
void setStackSize(uint stackSize)

[since 6.2] threadPriority : QThread::Priority

このプロパティは、新しいワーカースレッドのスレッド優先度を保持します。

このプロパティの値は、スレッドプールが新しいスレッドを開始するときにのみ使用されます。変更しても、すでに実行されているスレッドには影響しません。

デフォルト値はQThread::InheritPriority で、QThreadQThreadPool オブジェクトが住んでいるのと同じ優先度を使用します。

このプロパティは Qt 6.2 で導入されました。

アクセス関数:

QThread::Priority threadPriority() const
void setThreadPriority(QThread::Priority priority)

QThread::Priorityも参照してください

メンバ関数のドキュメント

QThreadPool::QThreadPool(QObject *parent = nullptr)

与えられたparent でスレッドプールを構築する。

[virtual noexcept] QThreadPool::~QThreadPool()

QThreadPool を破棄する。 この関数は、すべてのランナブルが完了するまでブロックされる。

void QThreadPool::clear()

まだ開始されていないランナブルをキューから削除する。runnable->autoDelete() がtrue を返すランナブルが削除される。

start()も参照のこと

[since 6.0] bool QThreadPool::contains(const QThread *thread) const

thread がこのスレッドプールで管理されているスレッドである場合、true を返します。

この関数は Qt 6.0 で導入されました。

[static] QThreadPool *QThreadPool::globalInstance()

グローバルなQThreadPool インスタンスを返します。

void QThreadPool::releaseThread()

reserveThread() の呼び出しによって予約されていたスレッドを解放する。

注意: 事前にスレッドを予約せずにこの関数を呼び出すと、一時的にmaxThreadCount() が増加する。これは、あるスレッドが待機中にスリープ状態になり、他のスレッドが処理を続行できるようになる場合に便利です。スレッド・プールがactiveThreadCount() を正しく維持できるように、待機が終わったら必ずreserveThread() を呼び出すこと。

reserveThread()も参照のこと

void QThreadPool::reserveThread()

activeThreadCount() とmaxThreadCount() を無視して、1つのスレッドを予約する。

スレッドの使用が完了したら、releaseThread() を呼び出して、そのスレッドを再使用できるようにします。

注意 :maxThreadCount() スレッド以上を予約した場合でも、スレッド・プールは最低 1 つのスレッドを許可します。

注意: この関数を使用すると、報告されるアクティブ・スレッド数が増加する。つまり、この関数を使用すると、activeThreadCount() がmaxThreadCount() よりも大きな値を返す可能性がある。

releaseThread()も参照のこと

void QThreadPool::start(QRunnable *runnable, int priority = 0)

スレッドを予約し、そのスレッドを使用してrunnable を実行する。ただし、このスレッドによって現在のスレッド数がmaxThreadCount() を超える場合を除く。その場合、runnable が代わりに実行キューに追加される。priority 引数は、ランキューの実行順序を制御するために使用できる。

runnable->autoDelete() がtrue を返した場合、スレッド・プールがrunnable の所有権を持ち、runnable->run() が返った後、スレッド・プールによってrunnable が自動的に削除されることに注意。runnable->autoDelete() がfalse を返す場合、runnable の所有権は呼び出し元にある。この関数を呼び出した後にrunnable の自動削除を変更すると、未定義の動作になることに注意。

template <typename Callable, QRunnable::if_callable<Callable> = true> void QThreadPool::start(Callable &&callableToRun, int priority = 0)

これはオーバーロードされた関数である。

スレッドを予約し、そのスレッドを使用してcallableToRun を実行する。ただし、このスレッドによって現在のスレッド数がmaxThreadCount() を超える場合を除く。その場合、代わりにcallableToRun が実行キューに追加される。引数priority は、ランキューの実行順序を制御するために使用できる。

注: この関数は、Callable が引数ゼロで呼び出せる関数または関数オブジェクトである場合にのみ、オーバーロード解決に参加します。

注意 : Qt 6.6 より前のバージョンでは、この関数は std::function<void()> を引数に取るため、移動のみの callable を扱うことができませんでした。

[since 6.3] void QThreadPool::startOnReservedThread(QRunnable *runnable)

reserveThread() で予約されていたスレッドを解放し、そのスレッドを使用してrunnable を実行する。

runnable->autoDelete() がtrue を返した場合、スレッド・プールがrunnable の所有権を取得し、runnable->run() が返った後、スレッド・プールによってrunnable が自動的に削除されることに注意。runnable->autoDelete() がfalse を返す場合、runnable の所有権は呼び出し元にある。この関数を呼び出した後にrunnable の自動削除を変更すると、未定義の動作になることに注意。

注意: スレッドが予約されていないときにこの関数を呼び出すと、未定義の動作になります。

この関数は Qt 6.3 で導入されました。

reserveThread() およびstart()も参照してください

[since 6.3] template <typename Callable, QRunnable::if_callable<Callable> = true> void QThreadPool::startOnReservedThread(Callable &&callableToRun)

これはオーバーロードされた関数である。

reserveThread() で予約されていたスレッドを解放し、そのスレッドを使用してcallableToRun を実行する。

注意: この関数は、Callable が引数ゼロで呼び出せる関数または関数オブジェクトである場合にのみ、オーバーロード解決に参加します。

注意 : Qt 6.6より前のバージョンでは、この関数はstd::function<void()>を取るため、移動のみの呼び出し可能な関数を扱うことができませんでした。

この関数は Qt 6.3 で導入されました。

bool QThreadPool::tryStart(QRunnable *runnable)

runnable を実行するスレッドを予約しようとする。

呼び出し時に利用可能なスレッドがない場合、この関数は何もせず、false を返す。そうでない場合は、利用可能なスレッドを1つ使用してrunnable が直ちに実行され、この関数はtrue を返す。

runnable->autoDelete() がtrue を返した場合、成功するとスレッド・プールがrunnable の所有権を取得し、runnable->run() が返った後、スレッド・プールによってrunnable が自動的に削除されることに注意。runnable->autoDelete() がfalse を返した場合、runnable の所有権は呼び出し元にある。この関数を呼び出した後にrunnable の自動削除を変更すると、未定義の動作になることに注意。

template <typename Callable, QRunnable::if_callable<Callable> = true> bool QThreadPool::tryStart(Callable &&callableToRun)

これはオーバーロードされた関数である。

実行するスレッドを予約しようとするcallableToRun

呼び出し時に利用可能なスレッドがない場合、この関数は何もせず、false を返す。そうでない場合は、利用可能なスレッドを1つ使用してcallableToRun が直ちに実行され、この関数はtrue を返す。

注意: この関数は、Callable が引数ゼロで呼び出せる関数または関数オブジェクトである場合にのみ、オーバーロード解決に参加します。

注意 : Qt 6.6より前のバージョンでは、この関数はstd::function<void()>を取るため、移動のみの呼び出し可能な関数を扱うことができませんでした。

bool QThreadPool::tryTake(QRunnable *runnable)

指定されたrunnable がまだ開始されていない場合、キューから削除しようとする。runnableが開始されていない場合、true を返し、runnable の所有権は呼び出し元に移譲される(runnable->autoDelete() == true の場合も同様)。そうでない場合は、false を返す。

注意: runnable->autoDelete() == true の場合、この関数は間違ったrunnableを削除する可能性がある。これはABA問題として知られている。元のrunnable はすでに実行され、削除されている可能性がある。メモリは別のランナ ブルに再利用され、そのランナブルが意図したランナブルの代わりに削除される。このため、自動削除されないランナブルに対してのみ、この関数を呼び出すことを推奨する。

start() およびQRunnable::autoDelete()も参照のこと

[since 6.8] bool QThreadPool::waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever)

すべてのスレッドが終了するまでdeadline が切れるまで待ち、スレッドプールからすべてのスレッドを削除する。すべてのスレッドが削除された場合はtrue を返し、そうでない場合はfalse を返します。

この関数は Qt 6.8 で導入されました。

bool QThreadPool::waitForDone(int msecs)

すべてのスレッドが終了するまで最大msecs ミリ秒待機し、スレッドプールからすべてのスレッドを削除する。すべてのスレッドが削除された場合はtrue を返し、そうでない場合はfalse を返す。msecs が -1 の場合、この関数は最後のスレッドの終了を待ちます。

© 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.