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 属于线程类。
注意:该类中的所有函数都是线程安全的。
属性
|
|
公共职能
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() 。
类HelloWorldTask :公有QRunnable {voidrun() 覆盖 { qDebug() << "Hello world from thread" << QThread::currentThread(); }; HelloWorldTask*hello = newHelloWorldTask();// QThreadPool 取得所有权并自动删除 " hello"。QThreadPool::globalInstance()->start(hello);
QThreadPool 默认自动删除QRunnable 。使用QRunnable::setAutoDelete() 更改自动删除标志。
通过在QRunnable::run() 中调用tryStart(this),QThreadPool 支持多次执行同一个QRunnable 。如果启用了自动删除功能,QRunnable 将在最后一个线程退出运行函数时被删除。如果启用了自动删除功能,使用同一个QRunnable 多次调用start() 会产生竞争条件,因此不建议使用。
未使用一定时间的线程将过期。默认过期超时为 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 。我们建议在创建线程池后立即设置expiryTimeout ,但要在调用start() 之前设置。
访问函数:
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() 或更多线程,线程池仍将允许最少使用一个线程。
注: 此函数将增加报告的活动线程数。这意味着使用此函数后,activeThreadCount() 返回的值有可能大于maxThreadCount() 返回的值。
另请参见 releaseThread()。
[since 6.9]
QThread::QualityOfService QThreadPool::serviceLevel() const
返回线程的当前服务质量级别。
此函数在 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, QRunnable::if_callable<Callable> = true> void QThreadPool::start(Callable &&callableToRun, int priority = 0)
这是一个重载函数。
预留一个线程并用于运行callableToRun ,除非该线程会使当前线程数超过maxThreadCount() 。在这种情况下,callableToRun 会被添加到运行队列中。priority 参数可用于控制运行队列的执行顺序。
注意: 在 6.6 之前的 Qt 版本中,此函数使用 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 。
注意: 在 6.6 之前的 Qt 版本中,该函数使用 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, QRunnable::if_callable<Callable> = true> bool QThreadPool::tryStart(Callable &&callableToRun)
这是一个重载函数。
它试图保留一个运行callableToRun 的线程。
如果调用时没有可用线程,则该函数不会执行任何操作,并返回false
。否则,callableToRun 将立即使用一个可用线程运行,此函数返回true
。
注意: 在 6.6 之前的 Qt 版本中,该函数使用 std::function<void()>,因此无法处理只移动的可调用函数。
限制条件
只有当Callable
是一个可以用零参数调用的函数或函数对象时,才参与重载解析。
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.