QThreadPool Class
La classe QThreadPool gère un ensemble de QThreads. En savoir plus...
| En-tête : | #include <QThreadPool> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Hérite de : | QObject |
- Liste de tous les membres, y compris les membres hérités
- QThreadPool fait partie des classes de gestion des threads.
Remarque : toutes les fonctions de cette classe sont sûres pour les threads.
Propriétés
|
|
Fonctions publiques
| 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) |
Membres publics statiques
| QThreadPool * | globalInstance() |
Description détaillée
QThreadPool gère et recycle les objets individuels de type ` QThread ` afin de réduire les coûts liés à la création de threads dans les programmes qui utilisent des threads. Chaque application Qt dispose d’un objet `QThreadPool` global, accessible via l’appel à la fonction ` globalInstance()`.
Pour utiliser l'un des threads de QThreadPool, créez une sous-classe de ` QRunnable ` et implémentez la fonction virtuelle `run()`. Créez ensuite un objet de cette classe et transmettez-le à ` QThreadPool::start()`.
class HelloWorldTask : public QRunnable
{
void run() override
{
qDebug() << "Hello world from thread" << QThread::currentThread();
}
};
int main()
{
//...
HelloWorldTask *hello = new HelloWorldTask();
// QThreadPool prend en charge la gestion de « hello » et le supprime automatiquement
QThreadPool::globalInstance()->start(hello);
//...
}Par défaut, QThreadPool supprime automatiquement l’ QRunnable. Utilisez QRunnable::setAutoDelete() pour modifier l’indicateur de suppression automatique.
QThreadPool prend en charge l'exécution de la même QRunnable plusieurs fois en appelant tryStart(this) depuis l'intérieur de QRunnable::run(). Si autoDelete est activé, l'QRunnable sera supprimée lorsque le dernier thread quittera la fonction run. Appeler start() plusieurs fois avec la même QRunnable lorsque autoDelete est activé crée une condition de concurrence et n'est pas recommandé.
Les threads inutilisés pendant un certain temps expireront. Le délai d’expiration par défaut est de 30 000 millisecondes (30 secondes). Il est possible de le modifier à l’aide de la fonction ` setExpiryTimeout()`. La définition d’un délai d’expiration négatif désactive le mécanisme d’expiration.
Appelez maxThreadCount() pour connaître le nombre maximal de threads pouvant être utilisés. Si nécessaire, vous pouvez modifier cette limite à l’aide de setMaxThreadCount(). La valeur par défaut de maxThreadCount() est QThread::idealThreadCount(). La fonction activeThreadCount() renvoie le nombre de threads actuellement en cours d’exécution.
La fonction reserveThread() réserve un thread pour une utilisation externe. Utilisez releaseThread() lorsque vous n’avez plus besoin du thread, afin qu’il puisse être réutilisé. En substance, ces fonctions augmentent ou réduisent temporairement le nombre de threads actifs et s’avèrent utiles lors de la mise en œuvre d’opérations chronophages qui ne sont pas visibles par le QThreadPool.
Notez que QThreadPool est une classe de bas niveau destinée à la gestion des threads ; consultez le module Qt Concurrent pour découvrir des alternatives de plus haut niveau.
Voir également QRunnable.
Documentation sur les propriétés
[read-only] activeThreadCount : int
Cette propriété indique le nombre de threads actifs dans le pool de threads.
Remarque : il est possible que cette fonction renvoie une valeur supérieure à maxThreadCount(). Voir reserveThread() pour plus de détails.
Fonctions d'accès :
| int | activeThreadCount() const |
Voir également reserveThread() et releaseThread().
expiryTimeout : int
Cette propriété contient la valeur du délai d'expiration du thread, exprimée en millisecondes.
Les threads inactifs pendant une durée égale à expiryTimeout millisecondes sont considérés comme ayant expiré et sont alors fermés. Ces threads seront redémarrés si nécessaire. La valeur par défaut de ` expiryTimeout ` est de 30 000 millisecondes (30 secondes). Si ` expiryTimeout ` est une valeur négative, les threads nouvellement créés n'expireront pas ; en d'autres termes, ils ne se fermeront pas tant que le pool de threads n'aura pas été détruit.
Notez que la configuration de ` expiryTimeout ` n’a aucun effet sur les threads déjà en cours d’exécution. Seuls les threads nouvellement créés utiliseront la nouvelle valeur de ` expiryTimeout`. Nous recommandons de définir ` expiryTimeout ` immédiatement après la création du pool de threads, mais avant d’appeler la fonction ` start()`.
Fonctions d'accès :
| int | expiryTimeout() const |
| void | setExpiryTimeout(int expiryTimeout) |
maxThreadCount : int
Cette propriété définit le nombre maximal de threads utilisés par le pool de threads. Par défaut, cette propriété prend la valeur renvoyée par la fonction ` QThread::idealThreadCount()` au moment de la création de l'objet ` QThreadPool `.
Remarque : le pool de threads utilisera toujours au moins 1 thread, même si la limite de ` maxThreadCount ` est égale à zéro ou négative.
La valeur par défaut de ` maxThreadCount ` est ` QThread::idealThreadCount()`.
Fonctions d'accès :
| int | maxThreadCount() const |
| void | setMaxThreadCount(int maxThreadCount) |
stackSize : uint
Cette propriété définit la taille de la pile pour les threads de travail du pool de threads.
La valeur de cette propriété n’est utilisée que lorsque le pool de threads crée de nouveaux threads. Sa modification n’a aucun effet sur les threads déjà créés ou en cours d’exécution.
La valeur par défaut est 0, ce qui fait qu'QThread utilise la taille de pile par défaut du système d'exploitation.
Fonctions d'accès :
| uint | stackSize() const |
| void | setStackSize(uint stackSize) |
[since 6.2] threadPriority : QThread::Priority
Cette propriété définit la priorité des nouveaux threads de travail.
La valeur de cette propriété n'est utilisée que lorsque le pool de threads lance de nouveaux threads. Sa modification n'a aucun effet sur les threads déjà en cours d'exécution.
La valeur par défaut est « QThread::InheritPriority », ce qui fait que « QThread » utilise la même priorité que celle de l'objet « QThreadPool » dans lequel il réside.
Cette énumération a été introduite dans Qt 6.2.
Fonctions d’accès :
| QThread::Priority | threadPriority() const |
| void | setThreadPriority(QThread::Priority priority) |
Voir également QThread::Priority.
Documentation des fonctions membres
QThreadPool::QThreadPool(QObject *parent = nullptr)
Crée un pool de threads à l'aide de l'parent fournie.
[virtual noexcept] QThreadPool::~QThreadPool()
Supprime l'QThreadPool. Cette fonction reste bloquée jusqu'à ce que tous les éléments « runnable » aient été exécutés.
void QThreadPool::clear()
Supprime de la file d'attente les éléments « runnable » qui n'ont pas encore été lancés. Les éléments « runnable » pour lesquels la méthode runnable->autoDelete() renvoie la valeur « true » sont supprimés.
Voir également start().
[since 6.0] bool QThreadPool::contains(const QThread *thread) const
Renvoie « true » si « thread » est un thread géré par ce pool de threads.
Cette fonction a été introduite dans Qt 6.0.
[static] QThreadPool *QThreadPool::globalInstance()
Renvoie l'instance globale de ` QThreadPool `.
void QThreadPool::releaseThread()
Libère un thread précédemment réservé par un appel à la fonction ` reserveThread()`.
Remarque : l'appel de cette fonction sans avoir préalablement réservé de thread augmente temporairement la valeur de ` maxThreadCount()`. Cela s'avère utile lorsqu'un thread se met en veille dans l'attente de nouvelles tâches, permettant ainsi aux autres threads de continuer à s'exécuter. Veillez à appeler ` reserveThread()` une fois l'attente terminée, afin que le pool de threads puisse maintenir correctement la valeur de ` activeThreadCount()`.
Voir également reserveThread().
void QThreadPool::reserveThread()
Réserve un thread, sans tenir compte des fonctions ` activeThreadCount()` et ` maxThreadCount()`.
Une fois que vous avez fini d'utiliser le thread, appelez releaseThread() pour permettre sa réutilisation.
Remarque : même si vous réservez un ou plusieurs threads à l'aide de ` maxThreadCount()`, le pool de threads continuera de garantir au moins un thread.
Remarque : cette fonction augmente le nombre de threads actifs signalé. Cela signifie qu’en utilisant cette fonction, il est possible que la fonction ` activeThreadCount()` renvoie une valeur supérieure à celle de ` maxThreadCount()`.
Voir également releaseThread().
[since 6.9] QThread::QualityOfService QThreadPool::serviceLevel() const
Renvoie le niveau actuel de qualité de service (QoS) du thread.
Cette fonction a été introduite dans Qt 6.9.
Voir également setServiceLevel() et QThread::serviceLevel().
[since 6.9] void QThreadPool::setServiceLevel(QThread::QualityOfService serviceLevel)
Définit le niveau de qualité de service des objets thread créés après l'appel de ce setter sur « serviceLevel ».
Cette fonctionnalité n'est pas disponible sur toutes les plateformes. Consultez QThread::setServiceLevel() pour plus de détails.
Cette fonction a été introduite dans Qt 6.9.
Voir également serviceLevel() et QThread::serviceLevel().
void QThreadPool::start(QRunnable *runnable, int priority = 0)
Réserve un thread et l'utilise pour exécuter runnable, sauf si ce thread fait passer le nombre de threads actifs au-delà de la valeur définie par maxThreadCount(). Dans ce cas, runnable est ajouté à une file d'attente d'exécution. L'argument priority permet de contrôler l'ordre d'exécution dans la file d'attente.
Notez que le pool de threads prend possession de l’ runnable si runnable->autoDelete() renvoie true, et que l’ runnable sera automatiquement supprimé par le pool de threads après le retour de runnable->run(). Si runnable->autoDelete() renvoie false, la propriété de runnable reste acquise à l’appelant. Notez que la modification de la suppression automatique sur runnable après l’appel de cette fonction entraîne un comportement indéfini.
template <typename Callable> requires QRunnable::if_callable<Callable> void QThreadPool::start(Callable &&callableToRun, int priority = 0)
Réserve un thread et l'utilise pour exécuter callableToRun, à moins que ce thread ne fasse dépasser le nombre de threads actifs à maxThreadCount(). Dans ce cas, callableToRun est ajouté à une file d'attente d'exécution à la place. L'argument priority peut être utilisé pour contrôler l'ordre d'exécution de la file d'attente.
Remarque : dans les versions de Qt antérieures à la version 6.6, cette fonction prenait en paramètre un std::function<void()> et ne pouvait donc pas gérer les callables de type « move-only ».
Contraintes
Ne participe à la résolution des surcharges que si ` Callable ` est une fonction ou un objet fonction pouvant être appelé sans argument.
Il s'agit d'une fonction surchargée.
[since 6.3] void QThreadPool::startOnReservedThread(QRunnable *runnable)
Libère un thread précédemment réservé avec la fonction ` reserveThread()` et l'utilise pour exécuter la fonction ` runnable`.
Notez que le pool de threads prend possession de l’ runnable si runnable->autoDelete() renvoie true, et que l’ runnable sera automatiquement supprimé par le pool de threads après le retour de runnable->run(). Si runnable->autoDelete() renvoie false, la propriété de runnable reste acquise à l’appelant. Notez que la modification de la suppression automatique sur runnable après l’appel de cette fonction entraîne un comportement indéfini.
Remarque : l'appel de cette fonction alors qu'aucun thread n'est réservé entraîne un comportement indéfini.
Cette fonction a été introduite dans Qt 6.3.
Voir également reserveThread() et start().
[since 6.3] template <typename Callable> requires QRunnable::if_callable<Callable> void QThreadPool::startOnReservedThread(Callable &&callableToRun)
Libère un thread précédemment réservé avec la fonction ` reserveThread()` et l'utilise pour exécuter ` callableToRun`.
Remarque : dans les versions de Qt antérieures à la version 6.6, cette fonction prenait en paramètre un std::function<void()> et ne pouvait donc pas gérer les fonctions appelables en mode « move-only ».
Contraintes
Ne participe à la résolution des surcharges que si ` Callable ` est une fonction ou un objet-fonction pouvant être appelé sans argument.
Il s’agit d’une fonction surchargée.
Cette fonction a été introduite dans Qt 6.3.
bool QThreadPool::tryStart(QRunnable *runnable)
Tente de réserver un thread pour exécuter runnable.
Si aucun thread n’est disponible au moment de l’appel, cette fonction ne fait rien et renvoie false. Sinon, runnable est exécuté immédiatement à l’aide d’un thread disponible et cette fonction renvoie true.
Notez qu’en cas de réussite, le pool de threads prend possession de l’ runnable si runnable->autoDelete() renvoie true, et l’ runnable sera automatiquement supprimé par le pool de threads après le retour de runnable->run(). Si runnable->autoDelete() renvoie false, la propriété de runnable reste acquise à l’appelant. Notez que la modification de la suppression automatique de runnable après l’appel de cette fonction entraîne un comportement indéfini.
template <typename Callable> requires QRunnable::if_callable<Callable> bool QThreadPool::tryStart(Callable &&callableToRun)
Tente de réserver un thread pour exécuter callableToRun.
Si aucun thread n'est disponible au moment de l'appel, cette fonction ne fait rien et renvoie false. Dans le cas contraire, callableToRun est exécuté immédiatement à l'aide d'un thread disponible et cette fonction renvoie true.
Remarque : dans les versions de Qt antérieures à la version 6.6, cette fonction prenait en paramètre un std::function<void()> et ne pouvait donc pas gérer les callables en mode « move-only ».
Contraintes
Ne participe à la résolution des surcharges que si ` Callable ` est une fonction ou un objet-fonction pouvant être appelé sans argument.
Il s’agit d’une fonction surchargée.
bool QThreadPool::tryTake(QRunnable *runnable)
Tente de supprimer l'élément « runnable » spécifié de la file d'attente s'il n'a pas encore été lancé. Si l'élément « runnable » n'a pas été lancé, renvoie « true », et la propriété de « runnable » est transférée à l'appelant (même lorsque « runnable->autoDelete() == true »). Sinon, renvoie « false ».
Remarque : si runnable->autoDelete() == true, cette fonction peut supprimer le runnable incorrect. C’est ce qu’on appelle le problème ABA: le runnable d’origine a peut-être déjà été exécuté et a depuis été supprimé. La mémoire est réutilisée pour un autre runnable, qui est alors supprimé à la place de celui prévu. C'est pourquoi nous recommandons de n'appeler cette fonction que pour les éléments exécutables qui ne sont pas configurés pour une suppression automatique.
Voir également start() et QRunnable::autoDelete().
[since 6.8] bool QThreadPool::waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever)
Attend que la durée d'deadline soit écoulée pour que tous les threads se terminent, puis supprime tous les threads du pool de threads. Renvoie true si tous les threads ont été supprimés ; sinon, elle renvoie false.
Cette fonction a été introduite dans Qt 6.8.
bool QThreadPool::waitForDone(int msecs)
Attend jusqu'à msecs millisecondes que tous les threads se terminent, puis supprime tous les threads du pool de threads. Renvoie true si tous les threads ont été supprimés ; sinon, elle renvoie false. Si msecs est égal à -1, cette fonction attend que le dernier thread se termine.
© 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.