Класс QThreadPool
Класс QThreadPool управляет набором потоков QThreads. Подробнее...
| Заголовок: | #include <QThreadPool> |
| qmake: | QT += core |
| С момента: | Qt 4.4 |
| Наследует: | QObject |
Примечание: Все функции в этом классе являются потокобезопасными.
Свойства
- activeThreadCount : const int
- expiryTimeout : int
- maxThreadCount : int
- 1 свойство унаследовано от QObject
Открытые функции
| QThreadPool(QObject *parent = Q_NULLPTR) | |
| ~QThreadPool() | |
| int | activeThreadCount() const |
| void | clear() |
| int | expiryTimeout() const |
| int | maxThreadCount() const |
| void | releaseThread() |
| void | reserveThread() |
| void | setExpiryTimeout(int expiryTimeout) |
| void | setMaxThreadCount(int maxThreadCount) |
| void | start(QRunnable *runnable, int priority = 0) |
| bool | tryStart(QRunnable *runnable) |
| bool | tryTake(QRunnable *runnable) |
| bool | waitForDone(int msecs = -1) |
- 32 открытых функции унаследованы от QObject
Статические открытые члены
| QThreadPool * | globalInstance() |
- 11 статических открытых членов унаследованы от QObject
Дополнительные унаследованные члены
- 1 открытый слот унаследован от QObject
- 2 сигнала унаследованы от QObject
- 9 защищенных функций унаследованы от QObject
Подробное описание
Класс QThreadPool управляет набором потоков QThreads.
QThreadPool управляет и переиспользует отдельные объекты QThread, чтобы уменьшить затраты на создание потоков в программах, использующих потоки. Каждый Qt-приложение имеет один глобальный объект QThreadPool, к которому можно получить доступ, вызвав globalInstance().
Чтобы использовать один из потоков QThreadPool, подклассифицируйте QRunnable и реализуйте виртуальную функцию run(). Затем создайте объект этого класса и передайте его в QThreadPool::start().
class HelloWorldTask : public QRunnable
{
void run()
{
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.
Документация по свойствам
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
Это свойство представляет максимальное количество потоков, используемых пулом потоков.
Примечание: Пул потоков всегда будет использовать как минимум 1 поток, даже если maxThreadCount ограничение равно нулю или отрицательно.
По умолчанию maxThreadCount равно QThread::idealThreadCount().
Функции доступа:
| int | maxThreadCount() const |
| void | setMaxThreadCount(int maxThreadCount) |
Документация по функциям-членам
QThreadPool::QThreadPool(QObject *parent = Q_NULLPTR)
Конструктор пула потоков с заданным parent.
QThreadPool::~QThreadPool()
Уничтожает QThreadPool. Эта функция заблокирует выполнение, пока все задачи не будут завершены.
void QThreadPool::clear()
Удаляет задачи, которые еще не запущены из очереди. Задачи, для которых runnable->autoDelete() возвращает true , удаляются.
Эта функция была введена в Qt 5.2.
См. также start().
[static] QThreadPool *QThreadPool::globalInstance()
Возвращает глобальный экземпляр QThreadPool.
void QThreadPool::releaseThread()
Освобождает поток, ранее зарезервированный вызовом reserveThread().
Примечание: Вызов этой функции без предварительного резервирования потока временно увеличивает значение maxThreadCount(). Это полезно, когда поток засыпает в ожидании новой задачи, позволяя другим потокам продолжить работу. Не забудьте вызвать reserveThread() по завершении ожидания, чтобы пул потоков мог корректно поддерживать activeThreadCount().
См. также reserveThread().
void QThreadPool::reserveThread()
Резервирует один поток, игнорируя значения activeThreadCount() и maxThreadCount().
По завершении работы с потоком вызовите releaseThread(), чтобы позволить повторно использовать его.
Примечание: Эта функция всегда увеличивает количество активных потоков. Это означает, что при использовании этой функции возможно, что 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 после вызова этой функции приводит к неопределённому поведению.
bool QThreadPool::tryStart(QRunnable *runnable)
Попытка зарезервировать поток для выполнения runnable.
Если потоки недоступны в момент вызова, эта функция ничего не делает и возвращает false. В противном случае runnable выполняется немедленно с использованием доступного потока, и функция возвращает true.
Обратите внимание, что пул потоков принимает владение runnable, если runnable->autoDelete() возвращает true, и runnable будет удалён пулом потоков автоматически после возврата runnable->run(). Если runnable->autoDelete() возвращает false, владение runnable остаётся у вызывающего кода. Обратите внимание, что изменение автоудаления runnable после вызова этой функции приводит к неопределённому поведению.
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-5.9/qthreadpool.html