QThreadPool Class

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

Header: #include <QThreadPool>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Inherits: 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 アプリケーションは、globalInstance() を呼び出すことでアクセスできる、1 つのグローバル QThreadPool オブジェクトを持っています。

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

class HelloWorldTask : public QRunnable
{
    void run() override
    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
    }
};

HelloWorldTask *hello = new HelloWorldTask();
// QThreadPool takes ownership and deletes 'hello' automatically
QThreadPool::globalInstance()->start(hello);

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

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

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

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

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

QThreadPool はスレッドを管理するための低レベルのクラスであることに注意してください。

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この関数は、すべての runnables が完了するまでブロックされます。

void QThreadPool::clear()

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

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()>を取るため、移動のみの callable を扱うことができませんでした。

bool QThreadPool::tryTake(QRunnable *runnable)

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

注意: runnable->autoDelete() == true の場合、この関数は間違ったrunnableを削除する可能性がある。これはABA問題として知られている。元の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 の場合、この関数は最後のスレッドの終了を待ちます。

©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。