Spec-Zone.ru › Qt 5.6

Класс 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 cancel(QRunnable *runnable)
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 waitForDone(int msecs = -1)
  • 31 открытая функция унаследована от 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::cancel(QRunnable *runnable)

Удаляет указанный runnable из очереди, если он ещё не запущен. Задачи, для которых runnable->autoDelete() возвращает true удаляются.

Эта функция была добавлена в Qt 5.5.

См. также start().

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::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/archives/qt-5.6/qthreadpool.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API