QChronoTimer Class
La classe QChronoTimer permet de créer des minuteries récurrentes et ponctuelles. En savoir plus...
| 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 de : | 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 minuteurs. Pour l’utiliser, créez un objet QChronoTimer, soit en passant l’intervalle au constructeur, soit en le définissant après la construction à l’aide de ` setInterval()`, connectez son signal ` timeout()` aux slots appropriés, puis appelez ` start()`. Dès lors, il émettra le signal timeout() à intervalles réguliers. 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 minuteur pour qu’il ne se déclenche qu’une seule fois en appelant ` setSingleShot(true)`.
Remarque : QChronoTimer ne dispose pas de méthodes statiques singleShot(), car celles de QTimer fonctionnent déjà avec les types chrono et une résolution en nanosecondes.
Dans les applications multithread, vous pouvez utiliser QChronoTimer dans n’importe quel thread disposant d’une boucle d’événements. Pour démarrer une boucle d’événements à partir d’un thread non-GUI, utilisez QThread::exec(). Qt utilise l’ thread affinity du minuteur pour déterminer quel thread émettra le signal ` timeout()`. De ce fait, vous devez démarrer et arrêter le minuteur dans son propre thread ; il n’est pas possible de démarrer un minuteur à partir d’un autre thread.
Dans un cas particulier, un QChronoTimer dont le délai d’expiration est défini sur 0ns expirera dès que possible, bien que l’ordre d’exécution entre les « zero timers » et les autres sources d’événements ne soit pas spécifié. Les « zero timers » peuvent être utilisés pour effectuer certaines tâches tout en garantissant 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, la fonction ` processOneThing() ` sera appelée de manière répétée. Elle doit être écrite de telle sorte qu’elle renvoie toujours rapidement une valeur (par exemple, après le traitement d’un élément de données) afin que Qt puisse transmettre les événements à l’interface utilisateur et arrêter le minuteur dès qu’il a terminé tout son travail. Il s’agit de la méthode traditionnelle pour implémenter des tâches lourdes dans les applications GUI, mais comme le multithreading est désormais disponible sur un nombre croissant de plateformes, une alternative moderne consiste à exécuter ces tâches dans un thread autre que le thread de l’interface graphique (le thread principal). Qt dispose de la classe ` QThread `, qui peut être utilisée à cette fin.
Précision et résolution des temporisateurs
La précision des chronomètres dépend du système d’exploitation et du matériel sous-jacents. La plupart des plateformes prennent en charge la demande d’une précision à la nanoseconde pour les chronomètres (par exemple, la fonction ` nanosleep` de la bibliothèque libc), bien que la précision du chronomètre ne corresponde pas toujours à cette résolution dans de nombreuses situations réelles.
Vous pouvez définir la valeur de ` timer type ` pour indiquer à QChronoTimer quelle précision demander au système.
Pour la valeur Qt::PreciseTimer, QChronoTimer s’efforcera de maintenir la précision à 1ns. Les temporisateurs précis 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 limites de ces types :
- 5 % de l’intervalle pour Qt::CoarseTimer
500mspour Qt::VeryCoarseTimer
Tous les types de temporisateurs peuvent expirer 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 l'expiration, Qt émettra timeout() une seule fois, même si plusieurs délais d'expiration ont expiré, puis reprendra l'intervalle d'origine.
Alternatives à QChronoTimer
QChronoTimer offre une résolution en nanosecondes 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 alternative 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 :
- Utiliser ` QBasicTimer`, une classe de valeur légère encapsulant un identifiant de minuteur. Vous pouvez démarrer le minuteur avec ` QBasicTimer::start()` et l’arrêter avec ` QBasicTimer::stop()`. Vous pouvez gérer l’événement dans votre méthode ` timerEvent()` réimplémentée.
- timerEventUne méthode plus basique consiste à manipuler directement les identifiants de minuteurs. Pour démarrer le minuteur, appelez ` QObject::startTimer()` et enregistrez l’identifiant renvoyé. Pour l’arrêter, appelez ` QObject::killTimer()`. Vous pouvez gérer l’événement dans votre méthode ` QBasicTimer()` réimplémentée. Cette approche est généralement plus fastidieuse que l’utilisation de ` `.
L'utilisation de ` timerEvent()` présente l'inconvénient de ne pas prendre en charge certaines fonctionnalités de haut niveau, telles que les minuteurs à déclenchement unique et les signaux.
Certains systèmes d’exploitation limitent le nombre de temporisateurs pouvant être utilisés ; Qt s’efforce de contourner ces limitations.
Voir également QBasicTimer, QTimerEvent, QObject::timerEvent(), Temporisateurs et Horloge analogique.
Documentation sur les propriétés
[bindable read-only] active : bool
Remarque : cette propriété prend en charge les liaisons de type « QProperty ».
Cette propriété booléenne prend la valeur « true » si le minuteur est en cours d'exécution ; sinon, elle prend la valeur « false ».
Fonctions d'accès :
| bool | isActive() const |
[bindable] interval : std::chrono::nanoseconds
Remarque : cette propriété prend en charge les liaisons de type « QProperty ».
Cette propriété définit l'intervalle de délai d'expiration
La valeur par défaut de cette propriété est 0ns.
Un QChronoTimer dont le délai d’expiration est défini sur 0ns s’arrêtera dès que tous les événements de la file d’attente du système de fenêtrage auront été traités.
La modification de l’intervalle d’un minuteur en cours d’exécution modifie l’intervalle, appelle stop() puis start() sur le minuteur, et récupère une nouvelle id(). Si le minuteur 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îne un avertissement d’exécution et la valeur est réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s'il était en cours d'exécution ou ne pas le démarrer du tout).
Fonctions d'accès :
| std::chrono::nanoseconds | interval() const |
| void | setInterval(std::chrono::nanoseconds nsec) |
Voir également singleShot.
[read-only] remainingTime : std::chrono::nanoseconds
Cette propriété indique le temps restant
Renvoie la durée restante jusqu'à l'expiration du délai.
Si le minuteur est inactif, la durée renvoyée sera négative.
Si le minuteur est dépassé, la durée renvoyé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 de type « QProperty ».
Cette propriété indique si le temporisateur est un temporisateur à déclenchement unique
Un minuteur à déclenchement unique ne se déclenche qu'une seule fois, tandis que les minuteurs non à déclenchement unique se déclenchent à chaque 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 liaisons de type « QProperty ».
Contrôle la précision du minuteur
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 de membre
[explicit] QChronoTimer::QChronoTimer(QObject *parent = nullptr)
Crée un minuteur avec l'parent on fournie, en utilisant l'intervalle par défaut, 0ns.
[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)
Crée un minuteur avec l'parent on fournie, en utilisant un intervalle de nsec.
[override virtual noexcept] QChronoTimer::~QChronoTimer()
Supprime le minuteur.
template <typename Functor> QMetaObject::Connection QChronoTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Crée une connexion entre le signal ` timeout()` et ` slot ` afin de l'intégrer dans une boucle d'événements spécifique de ` context`, avec le type de connexion ` connectionType`, et renvoie un descripteur vers cette connexion.
Cette méthode est fournie à titre de commodité. Elle équivaut à appeler :
QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);Voir également QObject::connect() et timeout().
Qt::TimerId QChronoTimer::id() const
Renvoie un objet de type ` Qt::TimerId ` représentant l’identifiant du minuteur si celui-ci est en cours d’exécution ; sinon, renvoie ` Qt::TimerId::Invalid`.
Voir également Qt::TimerId.
bool QChronoTimer::isActive() const
Renvoie « true » si le minuteur est en cours d'exécution ; sinon, renvoie « false ».
Remarque : fonctionde lecture pour la propriété active.
[slot] void QChronoTimer::start()
Lance ou relance le chronomètre avec le délai d'expiration spécifié dans ` interval`.
Si le minuteur est déjà en cours d'exécution, il sera désactivé ( stopped ) puis redémarré. Cela modifiera également sa propriété ` id()`.
Si singleShot est vrai, le minuteur ne sera activé qu’une seule fois.
[slot] void QChronoTimer::stop()
Arrête le chronomètre.
Voir aussi start().
[private signal] void QChronoTimer::timeout()
Ce signal est émis lorsque le délai de la minuterie est écoulé.
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 également 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.