QChronoTimer Class
La classe QChronoTimer fournit des minuteries répétitives et à coup unique. Plus d'informations...
| En-tête : | #include <QChronoTimer> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Depuis : | Qt 6.8 |
| Hérite : | QObject |
- Liste de tous les membres, y compris les membres hérités
- QChronoTimer fait partie des classes d'événements.
Propriétés
|
|
Fonctions publiques
| QChronoTimer(QObject *parent = nullptr) | |
| QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr) | |
| virtual | ~QChronoTimer() override |
| QBindable<bool> | bindableActive() |
| QBindable<std::chrono::nanoseconds> | bindableInterval() |
| QBindable<bool> | bindableSingleShot() |
| QBindable<Qt::TimerType> | bindableTimerType() |
| QMetaObject::Connection | callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection) |
| Qt::TimerId | id() const |
| std::chrono::nanoseconds | interval() const |
| bool | isActive() const |
| bool | isSingleShot() const |
| std::chrono::nanoseconds | remainingTime() const |
| void | setInterval(std::chrono::nanoseconds nsec) |
| void | setSingleShot(bool singleShot) |
| void | setTimerType(Qt::TimerType atype) |
| Qt::TimerType | timerType() const |
Emplacements publics
Signaux
| void | timeout() |
Fonctions protégées réimplémentées
| virtual void | timerEvent(QTimerEvent *e) override |
Description détaillée
La classe QChronoTimer fournit une interface de programmation de haut niveau pour les timers. Pour l'utiliser, créez un QChronoTimer, soit en passant l'intervalle au constructeur, soit en le fixant après la construction en utilisant setInterval(), connectez son signal timeout() aux slots appropriés, et appelez start(). À partir de ce moment, il émettra le signal timeout() à intervalles constants. Par exemple :
auto *timer = new QChronoTimer(1s, this); connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing); timer->start(); QChronoTimer *timer = new QChronoTimer(this); connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing); timer->setInterval(1s); timer->start();
Vous pouvez configurer un timer pour qu'il ne se termine qu'une seule fois en appelant setSingleShot(true).
Remarque : QChronoTimer n'a pas de méthodes statiques singleShot(), car celles qui se trouvent sur QTimer fonctionnent déjà avec les types de chronos et la résolution en nanosecondes.
Dans les applications multithread, vous pouvez utiliser QChronoTimer dans n'importe quel thread qui a une boucle d'événement. Pour démarrer une boucle d'événements à partir d'un thread non-GUI, utilisez QThread::exec(). Qt utilise le thread affinity du timer pour déterminer quel thread émettra le signal timeout(). Pour cette raison, vous devez démarrer et arrêter la minuterie dans son propre thread ; il n'est pas possible de démarrer une minuterie à partir d'un autre thread.
Dans un cas particulier, un QChronoTimer avec un timeout de 0ns s'arrêtera dès que possible, bien que l'ordre entre les timers zéro et les autres sources d'événements ne soit pas spécifié. Les minuteurs zéro peuvent être utilisés pour effectuer un certain travail tout en fournissant une interface utilisateur réactive :
// The default interval is 0ns QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing); timer->start();
À partir de ce moment, processOneThing() sera appelé à plusieurs reprises. Il doit être écrit de manière à ce qu'il revienne toujours rapidement (par exemple, après avoir traité un élément de données) afin que Qt Quick puisse fournir des événements à l'interface utilisateur et arrêter le minuteur dès qu'il a fait tout son travail. C'est la manière traditionnelle de mettre en œuvre les tâches lourdes dans les applications d'interface graphique, mais comme le multithreading devient disponible sur de plus en plus de plateformes, une alternative moderne consiste à effectuer les tâches lourdes dans un thread autre que le thread (principal) de l'interface graphique. Qt dispose de la classe QThread, qui peut être utilisée à cette fin.
Précision et résolution de la minuterie
La précision des temporisateurs dépend du système d'exploitation et du matériel sous-jacents. La plupart des plates-formes peuvent demander une précision de l'ordre de la nano-seconde pour les minuteries (par exemple, nanosleep de la libc), bien que la précision de la minuterie ne corresponde pas à cette résolution dans de nombreuses situations réelles.
Vous pouvez définir timer type pour indiquer à QChronoTimer quelle précision demander au système.
Pour Qt::PreciseTimer, QChronoTimer essaiera de maintenir la précision à 1ns. Les minuteries précises ne s'arrêteront jamais plus tôt que prévu.
Pour les types Qt::CoarseTimer et Qt::VeryCoarseTimer, QChronoTimer peut se réveiller plus tôt que prévu, dans les marges prévues pour ces types :
- 5% de l'intervalle pour Qt::CoarseTimer
500mspour Qt::VeryCoarseTimer
Tous les types de timer peuvent se terminer plus tard que prévu si le système est occupé ou incapable de fournir la précision demandée. Dans un tel cas de dépassement de délai, Qt XML n'émettra timeout() qu'une seule fois, même si plusieurs délais ont expiré, et reprendra ensuite l'intervalle original.
Alternatives à QChronoTimer
QChronoTimer offre une résolution de l'ordre de la nanoseconde et une plage de ±292 ans (moins de risques de débordement d'entier si l'intervalle est plus long que std::numeric_limits<int>::max()). Si vous n'avez besoin que d'une résolution en millisecondes et d'une plage de ±24 jours, vous pouvez continuer à utiliser la classe classique QTimer.
Une autre solution consiste à réimplémenter la méthode QObject::timerEvent() dans votre classe (qui doit être une sous-classe de QObject) et à utiliser l'une des approches suivantes :
- Utilisation de QBasicTimer, une classe de valeur légère contenant un ID de minuterie. Vous pouvez démarrer la minuterie avec QBasicTimer::start() et l'arrêter avec QBasicTimer::stop(). Vous pouvez gérer l'événement dans votre version réimplémentée de timerEvent().
- Une méthode de plus bas niveau consiste à manipuler directement les ID de la minuterie. Pour démarrer la minuterie, appelez QObject::startTimer(), en stockant l'ID renvoyée. Pour arrêter la minuterie, appelez QObject::killTimer(). Vous pouvez gérer l'événement dans votre version réimplémentée de timerEvent(). Cette approche est généralement plus lourde que l'utilisation de QBasicTimer.
L'utilisation de timerEvent() présente l'inconvénient de ne pas prendre en charge certaines fonctionnalités de haut niveau, telles que les minuteries et les signaux à action unique.
Certains systèmes d'exploitation limitent le nombre de temporisateurs qui peuvent être utilisés ; Qt fait de son mieux pour contourner ces limitations.
Voir aussi QBasicTimer, QTimerEvent, QObject::timerEvent(), Timers, et Analog Clock.
Documentation sur les propriétés
[bindable read-only] active : bool
Remarque : Cette propriété prend en charge les liaisons QProperty.
Cette propriété booléenne vaut true si la minuterie est en cours d'exécution, sinon false.
Fonctions d'accès :
| bool | isActive() const |
[bindable] interval : std::chrono::nanoseconds
Note : Cette propriété supporte les liens QProperty.
Cette propriété contient l'intervalle de temporisation
La valeur par défaut de cette propriété est 0ns.
Un QChronoTimer avec un délai d'attente de 0ns s'arrêtera dès que tous les événements de la file d'attente du système de fenêtres auront été traités.
La définition de l'intervalle d'une minuterie en cours d'exécution modifie l'intervalle, stop() puis start() la minuterie et acquiert un nouveau id(). Si la minuterie n'est pas en cours d'exécution, seul l'intervalle est modifié.
À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement d'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, une minuterie Qt vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant la minuterie si elle était en cours d'exécution ou en ne la démarrant pas du tout).
Fonctions d'accès :
| std::chrono::nanoseconds | interval() const |
| void | setInterval(std::chrono::nanoseconds nsec) |
Voir aussi singleShot.
[read-only] remainingTime : std::chrono::nanoseconds
Cette propriété contient le temps restant
Renvoie la durée restante jusqu'à l'expiration du délai.
Si la minuterie est inactive, la durée renvoyée sera négative.
Si la minuterie est en retard, la durée retournée sera 0ns.
Fonctions d'accès :
| std::chrono::nanoseconds | remainingTime() const |
Voir également interval.
[bindable] singleShot : bool
Remarque : Cette propriété prend en charge les liaisons QProperty.
Cette propriété indique si la minuterie est une minuterie à déclenchement unique
Une minuterie à un coup ne se déclenche qu'une seule fois, tandis que les minuteries à un autre coup se déclenchent tous les interval.
La valeur par défaut de cette propriété est false.
Fonctions d'accès :
| bool | isSingleShot() const |
| void | setSingleShot(bool singleShot) |
Voir également interval.
[bindable] timerType : Qt::TimerType
Remarque : Cette propriété prend en charge les liens QProperty.
Contrôle la précision de la minuterie
La valeur par défaut de cette propriété est Qt::CoarseTimer.
Fonctions d'accès :
| Qt::TimerType | timerType() const |
| void | setTimerType(Qt::TimerType atype) |
Voir également Qt::TimerType.
Documentation sur les fonctions membres
[explicit] QChronoTimer::QChronoTimer(QObject *parent = nullptr)
Construit un timer avec la valeur parent, en utilisant l'intervalle par défaut, 0ns.
[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)
Construit un timer avec la donnée parent, en utilisant un intervalle de nsec.
[override virtual noexcept] QChronoTimer::~QChronoTimer()
Détruit la minuterie.
template <typename Functor> QMetaObject::Connection QChronoTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Crée une connexion à partir du signal timeout() vers slot pour être placée dans une boucle d'événement spécifique de context, avec le type de connexion connectionType, et renvoie un handle vers la connexion.
Cette méthode est fournie par commodité. Elle est équivalente à un appel :
QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);
Voir aussi QObject::connect() et timeout().
Qt::TimerId QChronoTimer::id() const
Retourne un Qt::TimerId représentant l'ID du timer si le timer est en cours d'exécution, sinon retourne Qt::TimerId::Invalid.
Voir aussi Qt::TimerId.
bool QChronoTimer::isActive() const
Renvoie true si la minuterie est en cours ; sinon, renvoie false.
Note : Fonction Getter pour la propriété active.
[slot] void QChronoTimer::start()
Démarre ou redémarre la minuterie avec le délai spécifié dans interval.
Si la minuterie est déjà en cours d'exécution, elle sera stopped et redémarrée. Cela modifiera également son id().
Si singleShot est vrai, la minuterie ne sera activée qu'une seule fois.
[slot] void QChronoTimer::stop()
Arrête la minuterie.
Voir aussi start().
[private signal] void QChronoTimer::timeout()
Ce signal est émis lorsque la minuterie s'arrête.
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux mais ne peut pas être émis par l'utilisateur.
Voir aussi interval, start(), et stop().
[override virtual protected] void QChronoTimer::timerEvent(QTimerEvent *e)
Réimplémente : QObject::timerEvent(QTimerEvent *event).
© 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.