QWaitCondition Class
La classe QWaitCondition fournit une variable de condition pour la synchronisation des threads. Plus d'informations...
| 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 de Threading Classes.
Note : 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 certaine condition a été remplie. Un ou plusieurs threads peuvent se bloquer en attendant qu'une QWaitCondition établisse une condition avec wakeOne() ou wakeAll(). Utilisez wakeOne() pour réveiller un thread choisi au hasard ou wakeAll() pour les réveiller tous.
Supposons, par exemple, 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, chacun d'entre eux ayant un corps run() comme 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 appuis sur les touches et réveillerait les trois autres threads chaque fois qu'il en recevrait un, comme ceci : Ici, la variable est une variable globale de type QWaitCondition :
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 sont encore sur 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 en utilisant un compteur et un QMutex pour le surveiller. Par exemple, voici le nouveau code pour les threads de travailleur :
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 parce que les résultats de deux threads qui tentent de modifier simultanément la valeur de la même variable sont imprévisibles.
Les conditions d'attente sont une puissante primitive de synchronisation des threads. L'exemple Producer and Consumer using Wait Conditions 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 aussi QMutex, QSemaphore, QThread, et Producer and Consumer using Wait Conditions.
Documentation des fonctions membres
QWaitCondition::QWaitCondition()
Construit un nouvel objet de condition d'attente.
[noexcept] QWaitCondition::~QWaitCondition()
Détruit l'objet condition d'attente.
void QWaitCondition::notify_all()
Cette fonction est fournie pour la compatibilité STL. Elle est équivalente à wakeAll().
void QWaitCondition::notify_one()
Cette fonction est fournie pour la compatibilité STL. Elle est équivalente à wakeOne().
bool QWaitCondition::wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
Libère le site lockedMutex et attend la condition d'attente. Le lockedMutex doit être initialement verrouillé par le thread appelant. Si lockedMutex n'est pas dans un état verrouillé, le comportement est indéfini. Si lockedMutex est un mutex récursif, cette fonction revient immédiatement. L'adresse lockedMutex sera déverrouillée et le thread appelant bloquera jusqu'à ce que l'une ou l'autre de ces conditions soit remplie :
- Un autre thread le signale en utilisant wakeOne() ou wakeAll(). Dans ce cas, cette fonction renverra true.
- le délai indiqué par deadline est atteint. Si deadline est
QDeadlineTimer::Forever(par défaut), le délai d'attente ne sera jamais dépassé (l'événement doit être signalé). Cette fonction renverra false si le délai d'attente a expiré.
L'adresse lockedMutex sera remise dans le même état de verrouillage. Cette fonction est fournie pour permettre la transition atomique de l'état verrouillé à l'état d'attente.
Voir également wakeOne() et wakeAll().
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
Libère le site lockedReadWriteLock et attend la condition d'attente. Le lockedReadWriteLock doit être initialement verrouillé par le thread appelant. Si lockedReadWriteLock n'est pas dans un état verrouillé, cette fonction retourne immédiatement. L'adresse lockedReadWriteLock ne doit pas être verrouillée de manière récursive, sinon cette fonction ne libérera pas le verrou correctement. L'adresse lockedReadWriteLock sera déverrouillée et le thread appelant se bloquera jusqu'à ce que l'une ou l'autre de ces conditions soit remplie :
- Un autre thread le signale en utilisant wakeOne() ou wakeAll(). Dans ce cas, cette fonction renverra true.
- le délai indiqué par deadline est atteint. Si deadline est
QDeadlineTimer::Forever(par défaut), le délai d'attente ne sera jamais dépassé (l'événement doit être signalé). Cette fonction renverra false si le délai d'attente a expiré.
L'adresse lockedReadWriteLock sera remise dans le même état de verrouillage. Cette fonction est fournie pour permettre la transition atomique de l'état verrouillé à l'état d'attente.
Voir également wakeOne() et wakeAll().
bool QWaitCondition::wait(QMutex *lockedMutex, unsigned long time)
Libère le site lockedMutex et attend la condition d'attente pendant time millisecondes.
Il s'agit d'une fonction surchargée.
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
Libère le site lockedReadWriteLock et attend la condition d'attente 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 de la politique d'ordonnancement du système d'exploitation et ne peut être contrôlé ou prédit.
Voir également wakeOne().
void QWaitCondition::wakeOne()
Réveille un thread en attente de la condition d'attente. Le thread réveillé dépend de la politique 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 en fonction de 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.