QWaitCondition Class
La classe QWaitCondition fournit une variable de condition permettant de synchroniser les threads. En savoir plus...
| En-tête : | #include <QWaitCondition> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
- Liste de tous les membres, y compris les membres hérités
- QWaitCondition fait partie des classes de gestion des threads.
Remarque : toutes les fonctions de cette classe sont sûres pour les threads.
Fonctions publiques
| QWaitCondition() | |
| ~QWaitCondition() | |
| void | notify_all() |
| void | notify_one() |
| bool | wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
| bool | wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
| bool | wait(QMutex *lockedMutex, unsigned long time) |
| bool | wait(QReadWriteLock *lockedReadWriteLock, unsigned long time) |
| void | wakeAll() |
| void | wakeOne() |
Description détaillée
QWaitCondition permet à un thread d’indiquer à d’autres threads qu’une condition donnée est remplie. Un ou plusieurs threads peuvent se bloquer en attendant qu’un objet QWaitCondition définisse une condition à l’aide des méthodes ` wakeOne()` ou ` wakeAll()`. Utilisez ` wakeOne()` pour réveiller un thread sélectionné au hasard, ou ` wakeAll()` pour tous les réveiller.
Par exemple, supposons que nous ayons trois tâches à exécuter chaque fois que l’utilisateur appuie sur une touche. Chaque tâche pourrait être divisée en un thread, dont le corps de la fonction run() ressemblerait à ceci :
forever {
mutex.lock();
keyPressed.wait(&mutex);
do_something();
mutex.unlock();
}Ici, la variable keyPressed est une variable globale de type QWaitCondition.
Un quatrième thread lirait les frappes de touches et réveillerait les trois autres threads chaque fois qu’il en recevrait une, comme ceci :
forever {
getchar();
keyPressed.wakeAll();
}L’ordre dans lequel les trois threads sont réveillés n’est pas défini. De plus, si certains threads se trouvent encore dans do_something() lorsque la touche est enfoncée, ils ne seront pas réveillés (puisqu’ils n’attendent pas la variable de condition) et la tâche ne sera donc pas exécutée pour cette pression de touche. Ce problème peut être résolu à l’aide d’un compteur et d’une « QMutex » pour le protéger. Voici, par exemple, le nouveau code pour les threads de travail :
forever {
mutex.lock();
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
mutex.unlock();
}Voici le code du quatrième thread :
forever {
getchar();
mutex.lock();
// Sleep until there are no busy worker threads
while (count > 0) {
mutex.unlock();
sleep(1);
mutex.lock();
}
keyPressed.wakeAll();
mutex.unlock();
}Le mutex est nécessaire car les résultats obtenus lorsque deux threads tentent simultanément de modifier la valeur d’une même variable sont imprévisibles.
Les conditions d’attente constituent une primitive puissante de synchronisation des threads. L’exemple « Producteur et consommateur utilisant des conditions d’attente » montre comment utiliser QWaitCondition comme alternative à QSemaphore pour contrôler l’accès à un tampon circulaire partagé par un thread producteur et un thread consommateur.
Voir également QMutex, QSemaphore, QThread et « Producteur et consommateur utilisant des conditions d’attente ».
Documentation sur les fonctions membres
QWaitCondition::QWaitCondition()
Crée un nouvel objet de condition d'attente.
[noexcept] QWaitCondition::~QWaitCondition()
Supprime l'objet de condition d'attente.
void QWaitCondition::notify_all()
Cette fonction est fournie à des fins de compatibilité avec la STL. Elle équivaut à ` wakeAll()`.
void QWaitCondition::notify_one()
Cette fonction est fournie à des fins de compatibilité avec la STL. Elle équivaut à ` wakeOne()`.
bool QWaitCondition::wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
Libère le mutex lockedMutex et attend que la condition d'attente soit remplie. Le mutex lockedMutex doit avoir été verrouillé au préalable par le thread appelant. Si le mutex lockedMutex n'est pas verrouillé, le comportement est indéfini. Si le mutex lockedMutex est un mutex récursif, cette fonction renvoie immédiatement une valeur. Le mutex lockedMutex sera déverrouillé, et le thread appelant se bloquera jusqu'à ce que l'une des deux conditions suivantes soit remplie :
- Un autre thread lui envoie un signal à l’aide de wakeOne() ou wakeAll(). Dans ce cas, cette fonction renvoie « true ».
- le délai spécifié par deadline est atteint. Si deadline est défini sur
QDeadlineTimer::Forever(valeur par défaut), l’attente n’expirera jamais (l’événement doit être signalé). Cette fonction renverra « false » si l’attente a expiré.
L’ lockedMutex sera renvoyé dans le même état « verrouillé ». Cette fonction est fournie pour permettre la transition atomique de l’état « verrouillé » à l’état « en attente ».
Voir également wakeOne() et wakeAll().
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
Libère le verrou « lockedReadWriteLock » et attend que la condition d’attente soit remplie. Le verrou « lockedReadWriteLock » doit avoir été initialement verrouillé par le thread appelant. Si le verrou « lockedReadWriteLock » n’est pas verrouillé, cette fonction retourne immédiatement. Le verrou « lockedReadWriteLock » ne doit pas être verrouillé de manière récursive, sinon cette fonction ne libérera pas correctement le verrou. Le verrou « lockedReadWriteLock » sera déverrouillé, et le thread appelant se bloquera jusqu’à ce que l’une des deux conditions suivantes soit remplie :
- Un autre thread lui envoie un signal à l’aide de wakeOne() ou wakeAll(). Dans ce cas, cette fonction renverra « true ».
- le délai spécifié par ` deadline ` est atteint. Si ` deadline ` est défini sur `
QDeadlineTimer::Forever` (valeur par défaut), alors l'attente n'expirera jamais (l'événement doit être signalé). Cette fonction renvoie `false` si l'attente a expiré.
L’ lockedReadWriteLock sera renvoyé dans le même état « verrouillé ». Cette fonction est fournie pour permettre la transition atomique de l’état « verrouillé » à l’état « en attente ».
Voir également wakeOne() et wakeAll().
bool QWaitCondition::wait(QMutex *lockedMutex, unsigned long time)
Libère l'lockedMutex e et attend que la condition d'attente soit remplie pendant time millisecondes.
Il s'agit d'une fonction surchargée.
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
Libère l'lockedReadWriteLock e et attend que la condition d'attente soit remplie pendant time millisecondes.
Il s'agit d'une fonction surchargée.
void QWaitCondition::wakeAll()
Réveille tous les threads en attente de la condition d'attente. L'ordre dans lequel les threads sont réveillés dépend des politiques d'ordonnancement du système d'exploitation et ne peut être ni contrôlé ni prédit.
Voir également wakeOne().
void QWaitCondition::wakeOne()
Réveille un thread en attente d'une condition d'attente. Le thread réveillé dépend des politiques d'ordonnancement du système d'exploitation et ne peut être ni contrôlé ni prédit.
Si vous souhaitez réveiller un thread spécifique, la solution consiste généralement à utiliser différentes conditions d'attente et à faire en sorte que différents threads attendent différentes conditions.
Voir également ` wakeAll()`.
© 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.