このページでは

QThreadPool Class

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

ヘッダー: #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()
(since 6.9) QThread::QualityOfService serviceLevel() const
void setExpiryTimeout(int expiryTimeout)
void setMaxThreadCount(int maxThreadCount)
(since 6.9) void setServiceLevel(QThread::QualityOfService serviceLevel)
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のスレッドのいずれかを使用するには、QRunnable をサブクラス化し、run()仮想関数を実装します。その後、そのクラスのオブジェクトを作成し、QThreadPool::start()に渡しします。

classHelloWorldTask :publicQRunnable
{
    voidrun() override
    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
    }
};

intmain()
{
    //...
    HelloWorldTask*hello = newHelloWorldTask();
    // QThreadPool が 'hello' の所有権を引き継ぎ、自動的に削除します
    QThreadPool::globalInstance()->start(hello);
    //...
}

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

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

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

maxThreadCount() を呼び出すと、使用可能なスレッドの最大数を照会できます。必要に応じて、setMaxThreadCount() を使用してこの制限を変更できます。maxThreadCount() のデフォルト値はQThread::idealThreadCount() です。activeThreadCount() 関数は、現在処理を行っているスレッドの数を返します。

reserveThread() 関数は、外部で使用するためのスレッドを予約します。スレッドの使用が終了したら、releaseThread() を使用して、そのスレッドが再利用できるようにしてください。基本的に、これらの関数はアクティブなスレッド数を一時的に増減させるものであり、QThreadPool からは認識されない、処理に時間がかかる操作を実装する際に役立ちます。

なお、QThreadPool はスレッドを管理するための低レベルのクラスです。より高レベルの代替手段については、Qt Concurrent モジュールを参照してください。

QRunnableも参照してください 。

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

[read-only] activeThreadCount : 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つのスレッドを使用します。

maxThreadCount のデフォルト値はQThread::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 です。この値に設定すると、QThread は、QThreadPool オブジェクトが存在するスレッドプールと同じ優先度を使用します。

この列挙型は 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 つ以上確保した場合でも 、スレッドプールは最低 1 つのスレッドを確保します。

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

releaseThread()も参照してください 。

[since 6.9] QThread::QualityOfService QThreadPool::serviceLevel() const

スレッドの現在のサービス品質(QoS)レベルを返します。

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

setServiceLevel() およびQThread::serviceLevel()も参照してください 。

[since 6.9] void QThreadPool::setServiceLevel(QThread::QualityOfService serviceLevel)

このセッターの呼び出し後に作成されるスレッドオブジェクトのサービス品質(QoS)レベルをserviceLevel に設定します。

すべてのプラットフォームでサポートされているわけではありません。詳細については、QThread::setServiceLevel() を参照してください。

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

serviceLevel() およびQThread::serviceLevel()も参照してください 。

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> requires QRunnable::if_callable<Callable> void QThreadPool::start(Callable &&callableToRun, int priority = 0)

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

注: Qt 6.6 以前のバージョンでは 、この関数は std::function<void()> を受け取っていたため、移動専用(move-only)の呼び出し可能オブジェクトを処理できませんでした。

制約

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> requires QRunnable::if_callable<Callable> void QThreadPool::startOnReservedThread(Callable &&callableToRun)

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

注: Qt 6.6 以前のバージョンでは 、この関数は std::function<void()> を受け取っていたため、移動専用(move-only)の呼び出し可能オブジェクトを処理できませんでした。

制約

Callable が引数なしで呼び出せる関数または関数オブジェクトである場合にのみ、オーバーロード解決の対象となります。

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

この関数は 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> requires QRunnable::if_callable<Callable> bool QThreadPool::tryStart(Callable &&callableToRun)

callableToRun を実行するためのスレッドを予約しようとします。

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

注: Qt 6.6 以前のバージョンでは 、この関数は std::function<void()> を受け取っていたため、move のみの呼び出し可能オブジェクトを処理できませんでした。

制約

Callable が引数なしで呼び出せる関数または関数オブジェクトである場合にのみ、オーバーロード解決の対象となります。

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

bool QThreadPool::tryTake(QRunnable *runnable)

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

注: runnable->autoDelete() == trueの場合 、この関数は意図しないRunnableを削除してしまう可能性があります。これはABA問題として知られています。元のrunnable はすでに実行済みで、その後削除されている可能性があります。そのメモリは別のRunnableに再利用されており、その結果、意図したRunnableではなく、その別の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の場合、この関数は最後のスレッドが終了するまで待機します。

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