Класс QThreadPool
Класс QThreadPool управляет набором потоков QThreads. Подробнее...
| Заголовок: | #include <QThreadPool> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследует: | QObject |
Примечание: Все функции в этом классе являются безопасными для многопоточного доступа.
Свойства
|
|
Открытые функции
| QThreadPool(QObject *parent = nullptr) | |
| virtual | ~QThreadPool() |
| int | activeThreadCount() const |
| void | clear() |
| bool | contains(const QThread *thread) const |
| int | expiryTimeout() const |
| int | maxThreadCount() const |
| void | releaseThread() |
| void | reserveThread() |
| void | setExpiryTimeout(int expiryTimeout) |
Статические открытые члены
| QThreadPool * | globalInstance() |
Подробное описание
QThreadPool управляет и повторно использует отдельные объекты QThread, чтобы снизить затраты на создание потоков в программах, использующих потоки. Каждое приложение Qt имеет один глобальный объект QThreadPool, к которому можно получить доступ, вызвав globalInstance().
Чтобы использовать один из потоков QThreadPool, необходимо создать подкласс 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 более одного раза, вызвав tryStart(this) внутри QRunnable::run(). Если autoDelete включен, QRunnable будет удален, когда последний поток выйдет из функции run. Вызов start() несколько раз с одним и тем же QRunnable, когда autoDelete включен, создает гонку, и это не рекомендуется.
Потоки, которые не используются в течение определенного периода времени, истекут. По умолчанию срок действия истечения составляет 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
Это свойство содержит максимальное количество потоков, используемых пулом потоков. По умолчанию это свойство будет иметь значение QThread::idealThreadCount() в момент создания объекта QThreadPool.
Примечание: Пул потоков всегда будет использовать как минимум 1 поток, даже если ограничение maxThreadCount равно нулю или отрицательно.
Значение по умолчанию для maxThreadCount - QThread::idealThreadCount().
Функции доступа:
| int | maxThreadCount() const |
| void | setMaxThreadCount(int maxThreadCount) |
[since 5.10] stackSize : uint
Это свойство содержит размер стека для потоков-рабочих пула потоков.
Значение свойства используется только при создании новых потоков пулом потоков. Изменение его не влияет на уже созданные или запущенные потоки.
Значение по умолчанию равно 0, что заставляет QThread использовать значение по умолчанию для операционной системы.
Это свойство было добавлено в Qt 5.10.
Функции доступа:
| 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] QThreadPool::~QThreadPool()
Уничтожает QThreadPool. Эта функция будет заблокирована, пока все выполняемые задания не будут завершены.
[since 5.2] void QThreadPool::clear()
Удаляет задания, которые ещё не начаты из очереди. Задания, для которых runnable->autoDelete() возвращает true будут удалены.
Эта функция была добавлена в Qt 5.2.
См. также start().
[since 6.0] bool QThreadPool::contains(const QThread *thread) const
Возвращает true, если thread управляется этим пулом потоков.
Эта функция была добавлена в 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().
void QThreadPool::start(QRunnable *runnable, int priority = 0)
Резервирует поток и использует его для выполнения runnable, если при этом текущее количество потоков не превысит maxThreadCount(). В противном случае runnable добавляется в очередь выполнения. Аргумент priority может использоваться для управления порядком выполнения в очереди.
Обратите внимание, что пул потоков принимает владение runnable, если runnable->autoDelete() возвращает true, и runnable будет автоматически удалён пулом потоков после возвращения runnable->run(). Если runnable->autoDelete() возвращает false, владение runnable остаётся у вызывающей стороны. Обратите внимание, что изменение автоудаления для runnable после вызова этой функции приводит к неопределённому поведению.
[since 5.15] void QThreadPool::start(std::function<void ()> functionToRun, int priority = 0)
Это перегруженная функция.
Резервирует поток и использует его для выполнения functionToRun, если при этом текущее количество потоков не превысит maxThreadCount(). В противном случае functionToRun добавляется в очередь выполнения. Аргумент priority может использоваться для управления порядком выполнения в очереди.
Эта функция была добавлена в Qt 5.15.
bool QThreadPool::tryStart(QRunnable *runnable)
Попытка зарезервировать поток для выполнения runnable.
Если потоки недоступны в момент вызова, функция ничего не делает и возвращает false. В противном случае runnable выполняется немедленно с использованием доступного потока, и функция возвращает true.
Обратите внимание, что при успехе пул потоков принимает владение runnable, если runnable->autoDelete() возвращает true, и runnable будет автоматически удалён пулом потоков после возвращения runnable->run(). Если runnable->autoDelete() возвращает false, владение runnable остаётся у вызывающей стороны. Обратите внимание, что изменение автоудаления для runnable после вызова этой функции приводит к неопределённому поведению.
[since 5.15] bool QThreadPool::tryStart(std::function<void ()> functionToRun)
Это перегруженный метод.
Попытка зарезервировать поток для выполнения functionToRun.
Если потоки недоступны в момент вызова, функция ничего не делает и возвращает false. В противном случае, functionToRun выполняется немедленно с помощью одного доступного потока, и функция возвращает true.
Данная функция была добавлена в Qt 5.15.
[since 5.9] bool QThreadPool::tryTake(QRunnable *runnable)
Попытка удалить указанный runnable из очереди, если он ещё не запущен. Если запуск runnable не начался, функция возвращает true, и владение runnable передаётся вызывающему коду (даже если runnable->autoDelete() == true). В противном случае возвращает false.
Примечание: Если runnable->autoDelete() == true, эта функция может удалить не тот runnable. Это известно как проблема ABA: исходный runnable может уже завершиться и с тех пор быть удалён. Память повторно используется для другого runnable, который затем и удаляется вместо предполагаемого. По этой причине рекомендуется вызывать эту функцию только для runnable, которые не удаляются автоматически.
Данная функция была добавлена в Qt 5.9.
См. также start() и QRunnable::autoDelete().
bool QThreadPool::waitForDone(int msecs = -1)
Ожидает до msecs миллисекунд завершения всех потоков и удаляет все потоки из пула потоков. Возвращает true если все потоки были удалены; в противном случае возвращает false. Если msecs равно -1 (по умолчанию), таймаут игнорируется (ожидается завершения последнего потока).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qthreadpool.html