QChronoTimer Class
Die Klasse „QChronoTimer“ bietet Timer für wiederholte und einmalige Zeitmessungen. Mehr...
| Kopfzeile: | #include <QChronoTimer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Seit: | Qt 6.8 |
| Erbt von: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QChronoTimer ist Teil der Ereignisklassen.
Eigenschaften
|
|
Öffentliche Funktionen
| 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 |
Öffentliche Slots
Signale
| void | timeout() |
Neu implementierte geschützte Funktionen
| virtual void | timerEvent(QTimerEvent *e) override |
Ausführliche Beschreibung
Die Klasse `QChronoTimer` bietet eine hochrangige Programmierschnittstelle für Timer. Um sie zu verwenden, erstellen Sie einen `QChronoTimer`, indem Sie entweder das Intervall an den Konstruktor übergeben oder es nach der Erstellung mit ` setInterval()` festlegen, verbinden Sie das Signal ` timeout()` mit den entsprechenden Slots und rufen Sie ` start()` auf. Von da an gibt er in konstanten Intervallen das Signal „ timeout()“ aus. Zum Beispiel:
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();Sie können einen Timer so einstellen, dass er nur einmal abläuft, indem Sie ` setSingleShot(true)` aufrufen.
Hinweis: QChronoTimer verfügt über keine statischen `singleShot()`-Methoden, da die entsprechenden Methoden von ` QTimer ` bereits mit Chrono-Typen und einer Auflösung im Nanosekundenbereich arbeiten.
In Multithread-Anwendungen können Sie QChronoTimer in jedem Thread verwenden, der über eine Ereignisschleife verfügt. Um eine Ereignisschleife von einem Nicht-GUI-Thread aus zu starten, verwenden Sie ` QThread::exec()`. Qt verwendet die Eigenschaft „ thread affinity “ des Timers, um zu bestimmen, welcher Thread das Signal „ timeout()“ auslöst. Aus diesem Grund müssen Sie den Timer in seinem eigenen Thread starten und stoppen; es ist nicht möglich, einen Timer von einem anderen Thread aus zu starten.
Als Sonderfall läuft ein QChronoTimer mit einem Timeout von ` 0ns ` so schnell wie möglich ab, wobei die Reihenfolge zwischen Null-Timern und anderen Ereignisquellen nicht spezifiziert ist. Null-Timer können verwendet werden, um bestimmte Aufgaben auszuführen und gleichzeitig eine reaktionsschnelle Benutzeroberfläche zu gewährleisten:
// The default interval is 0ns
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing);
timer->start();Von diesem Zeitpunkt an wird „ processOneThing() “ wiederholt aufgerufen. Die Funktion sollte so geschrieben sein, dass sie stets schnell zurückkehrt (beispielsweise nach der Verarbeitung eines Datenelements), damit Qt Ereignisse an die Benutzeroberfläche übermitteln und den Timer anhalten kann, sobald er seine gesamte Arbeit erledigt hat. Dies ist die traditionelle Methode zur Implementierung rechenintensiver Aufgaben in GUI-Anwendungen. Da Multithreading jedoch auf immer mehr Plattformen verfügbar wird, besteht eine moderne Alternative darin, die rechenintensiven Aufgaben in einem anderen Thread als dem GUI- (Haupt-)Thread auszuführen. Qt verfügt über die Klasse „ QThread “, mit der dies erreicht werden kann.
Genauigkeit und Auflösung von Timern
Die Genauigkeit von Timern hängt vom zugrunde liegenden Betriebssystem und der Hardware ab. Die meisten Plattformen unterstützen die Anforderung einer Nanosekunden-Genauigkeit für Timer (zum Beispiel die Funktion ` nanosleep` der libc), auch wenn die Genauigkeit des Timers in vielen realen Situationen nicht dieser Auflösung entspricht.
Sie können die Option ` timer type ` festlegen, um QChronoTimer mitzuteilen, welche Genauigkeit vom System angefordert werden soll.
Bei der Einstellung „ Qt::PreciseTimer “ versucht QChronoTimer, die Genauigkeit auf „ 1ns “ zu halten. Präzise Timer laufen niemals früher als erwartet ab.
Bei den Typen „ Qt::CoarseTimer “ und „ Qt::VeryCoarseTimer “ kann QChronoTimer innerhalb der für diese Typen geltenden Toleranzen früher als erwartet aktiv werden:
- 5 % des Intervalls bei Qt::CoarseTimer
500msfür Qt::VeryCoarseTimer
Alle Timer-Typen können später als erwartet ablaufen, wenn das System ausgelastet ist oder die angeforderte Genauigkeit nicht gewährleisten kann. In einem solchen Fall einer Zeitüberschreitung löst Qt „ timeout()“ nur einmal aus, selbst wenn mehrere Zeitlimits abgelaufen sind, und setzt dann das ursprüngliche Intervall fort.
Alternativen zu QChronoTimer
QChronoTimer bietet eine Auflösung im Nanosekundenbereich und einen Bereich von ±292 Jahren (geringeres Risiko eines Ganzzahlüberlaufs, wenn das Intervall länger als ` std::numeric_limits<int>::max()` ist). Wenn Sie lediglich eine Auflösung im Millisekundenbereich und einen Bereich von ±24 Tagen benötigen, können Sie weiterhin die klassische Klasse ` QTimer ` verwenden
Eine weitere Alternative besteht darin, die Methode ` QObject::timerEvent()` in Ihrer Klasse (die eine Unterklasse von ` QObject` sein muss) neu zu implementieren und einen der folgenden Ansätze zu verwenden:
- Verwenden Sie ` QBasicTimer`, eine schlanke Wertklasse, die eine Timer-ID umschließt. Sie können den Timer mit ` QBasicTimer::start()` starten und mit ` QBasicTimer::stop()` stoppen. Das Ereignis können Sie in Ihrer neu implementierten Methode ` timerEvent()` verarbeiten.
- Eine eher low-level Methode ist die direkte Bearbeitung der Timer-IDs. Um den Timer zu starten, rufen Sie ` QObject::startTimer()` auf und speichern Sie die zurückgegebene ID. Um den Timer zu stoppen, rufen Sie ` QObject::killTimer()` auf. Sie können das Ereignis in Ihrer neu implementierten Methode ` timerEvent()` verarbeiten. Dieser Ansatz ist in der Regel umständlicher als die Verwendung von ` QBasicTimer`.
Ein Nachteil der Verwendung von ` timerEvent()` ist, dass einige hochrangige Funktionen, wie z. B. Einmal-Timer und Signale, nicht unterstützt werden.
Einige Betriebssysteme begrenzen die Anzahl der Timer, die verwendet werden dürfen; Qt versucht, diese Einschränkungen so gut wie möglich zu umgehen.
Siehe auch „ QBasicTimer“ , „ QTimerEvent “, „ QObject::timerEvent()“, „Timer“ und „Analog Clock“.
Dokumentation zu den Eigenschaften
[bindable read-only] active : bool
Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.
Diese boolesche Eigenschaft ist „ true “, wenn der Timer läuft; andernfalls „ false “.
Zugriffsfunktionen:
| bool | isActive() const |
[bindable] interval : std::chrono::nanoseconds
Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.
Diese Eigenschaft enthält das Timeout-Intervall
Der Standardwert für diese Eigenschaft ist „ 0ns “.
Ein „ QChronoTimer “ mit einem Timeout von „ 0ns “ läuft ab, sobald alle Ereignisse in der Ereigniswarteschlange des Fenstersystems verarbeitet wurden.
Das Festlegen des Intervalls eines laufenden Timers ändert das Intervall, ` stop()` und anschließend ` start()` den Timer und ruft eine neue ` id()` ab. Läuft der Timer nicht, wird nur das Intervall geändert.
Ab Qt 6.10 führt die Festlegung eines negativen Intervalls zu einer Laufzeitwarnung und dazu, dass der Wert auf 1 ms zurückgesetzt wird. Vor Qt 6.10 ließ sich bei einem Qt-Timer zwar ein negatives Intervall festlegen, das Verhalten war jedoch unvorhersehbar (beispielsweise wurde der Timer angehalten, wenn er lief, oder gar nicht erst gestartet).
Zugriffsfunktionen:
| std::chrono::nanoseconds | interval() const |
| void | setInterval(std::chrono::nanoseconds nsec) |
Siehe auch singleShot.
[read-only] remainingTime : std::chrono::nanoseconds
Diese Eigenschaft enthält die verbleibende Zeit
Gibt die verbleibende Zeit bis zum Ablauf des Timeouts zurück.
Ist der Timer inaktiv, ist die zurückgegebene Dauer negativ.
Ist der Timer abgelaufen, ist die zurückgegebene Dauer „ 0ns “.
Zugriffsfunktionen:
| std::chrono::nanoseconds | remainingTime() const |
Siehe auch „ interval “.
[bindable] singleShot : bool
Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.
Diese Eigenschaft gibt an, ob es sich bei dem Timer um einen Einmal-Timer handelt
Ein Einmal-Timer wird nur einmal ausgelöst, während nicht-Einmal-Timer bei jedem „ interval “ ausgelöst werden.
Der Standardwert für diese Eigenschaft ist „ false “.
Zugriffsfunktionen:
| bool | isSingleShot() const |
| void | setSingleShot(bool singleShot) |
Siehe auch „ interval “.
[bindable] timerType : Qt::TimerType
Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.
Steuert die Genauigkeit des Timers
Der Standardwert für diese Eigenschaft ist „ Qt::CoarseTimer “.
Zugriffsfunktionen:
| Qt::TimerType | timerType() const |
| void | setTimerType(Qt::TimerType atype) |
Siehe auch „ Qt::TimerType “.
Dokumentation zu Mitgliedsfunktionen
[explicit] QChronoTimer::QChronoTimer(QObject *parent = nullptr)
Erstellt einen Timer mit dem angegebenen „ parent “ unter Verwendung des Standardintervalls „ 0ns “.
[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)
Erstellt einen Timer mit dem angegebenen Wert „ parent “ und einem Intervall von „ nsec “.
[override virtual noexcept] QChronoTimer::~QChronoTimer()
Löscht den Timer.
template <typename Functor> QMetaObject::Connection QChronoTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Stellt eine Verbindung vom Signal „ timeout()“ zu „ slot “ her, die in einer bestimmten Ereignisschleife von „ context “ platziert werden soll, mit dem Verbindungstyp „ connectionType “, und gibt ein Handle für die Verbindung zurück.
Diese Methode wird als Erleichterung bereitgestellt. Sie entspricht dem Aufruf von:
QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);Siehe auch QObject::connect() und timeout().
Qt::TimerId QChronoTimer::id() const
Gibt einen „ Qt::TimerId “ zurück, der die Timer-ID darstellt, sofern der Timer läuft; andernfalls wird „ Qt::TimerId::Invalid “ zurückgegeben.
Siehe auch „ Qt::TimerId “.
bool QChronoTimer::isActive() const
Gibt „ true “ zurück, wenn der Timer läuft; andernfalls wird „ false “ zurückgegeben.
Hinweis: Getter -Funktion für die Eigenschaft „ active “.
[slot] void QChronoTimer::start()
Startet oder startet den Timer neu mit der in „ interval “ angegebenen Zeitüberschreitung.
Wenn der Timer bereits läuft, wird er auf „ stopped “ gesetzt und neu gestartet. Dadurch ändert sich auch sein Wert für „ id()“.
Ist ` singleShot ` wahr, wird der Timer nur einmal aktiviert.
[slot] void QChronoTimer::stop()
Hält den Timer an.
Siehe auch „ start()“.
[private signal] void QChronoTimer::timeout()
Dieses Signal wird ausgesendet, wenn der Timer abgelaufen ist.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, darf jedoch nicht vom Benutzer ausgelöst werden.
Siehe auch interval, start() und stop().
[override virtual protected] void QChronoTimer::timerEvent(QTimerEvent *e)
Implementiert: ` 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.