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 属于线程类。
注意:本类中的所有函数均为线程安全。
属性
|
|
公共函数
| 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 应用程序都有一个全局 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 的情况下,多次调用start() 并传入相同的QRunnable 会引发竞态条件,因此不建议这样做。
闲置一段时间的线程将过期。默认过期超时时间为 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()的值。当一个线程进入休眠状态等待更多工作时,此功能非常有用,因为它允许其他线程继续运行。请确保在等待结束时调用reserveThread(),以便线程池能够正确维护activeThreadCount()的值。
另请参阅 reserveThread()。
void QThreadPool::reserveThread()
预留一个线程,忽略activeThreadCount()和maxThreadCount()。
使用完该线程后,请调用releaseThread() 使其可被重复使用。
注意:即使 通过maxThreadCount() 预留了 x 个或更多线程,线程池仍会保留至少一个线程。
注意:此 函数会增加报告的活跃线程数。这意味着,使用此函数后,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)
将调用此设置器后创建的线程对象的服务质量级别设置为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()> 作为参数,因此无法处理仅支持移动的可调用对象。
限制
仅当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()> 作为参数,因此无法处理仅支持移动的可调用对象。
约束
仅当Callable 是可不带参数调用的函数或函数对象时,才参与重载解析。
这是一个重载函数。
该函数在 Qt 6.3 中引入。
bool QThreadPool::tryStart(QRunnable *runnable)
尝试预留一个线程来运行runnable 。
如果在调用时没有可用线程,则此函数不执行任何操作并返回false 。否则,将立即使用一个可用线程运行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 。否则,将立即使用一个可用线程运行callableToRun ,并返回true 。
注意:在 Qt 6.6 之前的版本中 ,该函数接受 std::function<void()> 作为参数,因此无法处理仅支持移动的可调用对象。
约束
仅当Callable 是可不带参数调用的函数或函数对象时,才参与重载解析。
这是一个重载函数。
bool QThreadPool::tryTake(QRunnable *runnable)
如果指定的runnable 尚未启动,则尝试将其从队列中移除。如果该可运行对象尚未启动,则返回true ,且runnable 的所有权将转移给调用者(即使runnable->autoDelete() == true 也是如此)。否则返回false 。
注意:如果 runnable->autoDelete() == true ,此函数可能会移除错误的可运行对象。这被称为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,则该函数将等待最后一个线程退出。
© 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.