QElapsedTimer Class
Die Klasse QElapsedTimer bietet eine schnelle Möglichkeit, verstrichene Zeiten zu berechnen. Mehr...
Kopfzeile: | #include <QElapsedTimer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Diese Klasse ist stark vergleichbar.
Hinweis: Alle Funktionen in dieser Klasse sind reentrant.
Öffentliche Typen
enum | ClockType { SystemTime, MonotonicClock, TickCounter, MachAbsoluteTime, PerformanceCounter } |
Duration | |
TimePoint |
Öffentliche Funktionen
QElapsedTimer() | |
(since 6.6) QElapsedTimer::Duration | durationElapsed() const |
(since 6.6) QElapsedTimer::Duration | durationTo(const QElapsedTimer &other) const |
qint64 | elapsed() const |
bool | hasExpired(qint64 timeout) const |
void | invalidate() |
bool | isValid() const |
qint64 | msecsSinceReference() const |
qint64 | msecsTo(const QElapsedTimer &other) const |
qint64 | nsecsElapsed() const |
qint64 | restart() |
qint64 | secsTo(const QElapsedTimer &other) const |
void | start() |
Statische öffentliche Mitglieder
QElapsedTimer::ClockType | clockType() |
bool | isMonotonic() |
Verwandte Nicht-Mitglieder
bool | operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs) |
bool | operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs) |
bool | operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs) |
Detaillierte Beschreibung
Die Klasse QElapsedTimer wird normalerweise verwendet, um schnell zu berechnen, wie viel Zeit zwischen zwei Ereignissen verstrichen ist. Ihre API ist der von QTime ähnlich, so dass Code, der diese Klasse verwendet hat, schnell auf die neue Klasse portiert werden kann.
Im Gegensatz zu QTime versucht QElapsedTimer jedoch, wenn möglich, monotone Uhren zu verwenden. Das bedeutet, dass es nicht möglich ist, QElapsedTimer-Objekte in eine für Menschen lesbare Zeit zu konvertieren.
Der typische Anwendungsfall für die Klasse ist die Ermittlung der Zeit, die für eine langsame Operation aufgewendet wurde. Das einfachste Beispiel für einen solchen Fall ist für Debugging-Zwecke, wie im folgenden Beispiel:
QElapsedTimer timer; timer.start(); slowOperation1(); qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
In diesem Beispiel wird der Timer durch einen Aufruf von start() gestartet und die verstrichene Zeit wird durch die Funktion elapsed() berechnet.
Die verstrichene Zeit kann auch verwendet werden, um die verfügbare Zeit für eine weitere Operation neu zu berechnen, nachdem die erste abgeschlossen ist. Dies ist nützlich, wenn die Ausführung innerhalb einer bestimmten Zeitspanne abgeschlossen werden muss, aber mehrere Schritte erforderlich sind. Die Funktionen vom Typ waitFor
in QIODevice und seinen Unterklassen sind gute Beispiele für einen solchen Bedarf. In diesem Fall könnte der Code wie folgt aussehen:
void executeSlowOperations(int timeout) { QElapsedTimer timer; timer.start(); slowOperation1(); int remainingTime = timeout - timer.elapsed(); if (remainingTime > 0) slowOperation2(remainingTime); }
Ein anderer Anwendungsfall besteht darin, eine bestimmte Operation für eine bestimmte Zeitspanne auszuführen. Hierfür bietet QElapsedTimer die Komfortfunktion hasExpired(), mit der man feststellen kann, ob eine bestimmte Anzahl von Millisekunden bereits verstrichen ist:
void executeOperationsForTime(int ms) { QElapsedTimer timer; timer.start(); while (!timer.hasExpired(ms)) slowOperation1(); }
Oft ist es bequemer, in diesem Fall QDeadlineTimer zu verwenden, die zu einem Timeout in der Zukunft zählt, anstatt die verstrichene Zeit zu verfolgen.
Referenz-Uhren
QElapsedTimer verwendet die monotone Referenzuhr der Plattform auf allen Plattformen, die dies unterstützen (siehe QElapsedTimer::isMonotonic()). Dies hat den zusätzlichen Vorteil, dass QElapsedTimer immun gegen Zeitkorrekturen ist, wie z.B. durch den Benutzer, der die Zeit korrigiert. Auch ist QElapsedTimer im Gegensatz zu QTime immun gegen Änderungen der Zeitzoneneinstellungen, wie z.B. Sommerzeit.
Auf der anderen Seite bedeutet dies, dass QElapsedTimer-Werte nur mit anderen Werten verglichen werden können, die die gleiche Referenz verwenden. Dies gilt insbesondere, wenn die Zeit seit der Referenz aus dem QElapsedTimer-Objekt extrahiert (QElapsedTimer::msecsSinceReference()) und serialisiert wird. Diese Werte sollten niemals über das Netzwerk ausgetauscht oder auf der Festplatte gespeichert werden, da man nicht weiß, ob der Computerknoten, der die Daten empfängt, derselbe ist wie der, von dem sie stammen, oder ob er seitdem neu gebootet wurde.
Es ist jedoch möglich, den Wert mit anderen Prozessen auszutauschen, die auf demselben Rechner laufen, vorausgesetzt, sie verwenden ebenfalls dieselbe Referenzuhr. QElapsedTimer verwendet immer dieselbe Uhr, so dass es sicher ist, mit dem Wert eines anderen Prozesses auf demselben Rechner zu vergleichen. Wenn Sie mit Werten vergleichen, die von anderen APIs erzeugt wurden, sollten Sie überprüfen, ob die verwendete Uhr die gleiche ist wie die von QElapsedTimer (siehe QElapsedTimer::clockType()).
Siehe auch QTime, QChronoTimer, und QDeadlineTimer.
Dokumentation der Mitgliedstypen
enum QElapsedTimer::ClockType
Diese Aufzählung enthält die verschiedenen Uhrentypen, die QElapsedTimer verwenden kann.
QElapsedTimer wird immer denselben Uhrentyp in einer bestimmten Maschine verwenden, so dass sich dieser Wert während der Lebensdauer eines Programms nicht ändert. Es wird bereitgestellt, damit QElapsedTimer mit anderen Nicht-Qt-Implementierungen verwendet werden kann, um zu garantieren, dass derselbe Referenztakt verwendet wird.
Konstante | Wert | Beschreibung |
---|---|---|
QElapsedTimer::SystemTime | 0 | Die für Menschen lesbare Systemzeit. Diese Uhr ist nicht monoton. |
QElapsedTimer::MonotonicClock | 1 | Die monotone Uhr des Systems, die normalerweise in Unix-Systemen zu finden ist. Diese Uhr ist monoton. |
QElapsedTimer::TickCounter | 2 | Wird nicht mehr verwendet. |
QElapsedTimer::MachAbsoluteTime | 3 | Die absolute Zeit des Mach-Kerns (macOS und iOS). Diese Uhr ist monoton. |
QElapsedTimer::PerformanceCounter | 4 | Der von Windows bereitgestellte Leistungszähler. Diese Uhr ist monoton. |
SystemZeit
Die Systemzeituhr ist die reine Echtzeit, ausgedrückt in Millisekunden seit dem 1. Januar 1970 um 0:00 UTC. Sie entspricht dem Wert, der von der C- und POSIX-Funktion time
zurückgegeben wird, wobei die Millisekunden hinzugefügt werden. Dieser Uhrentyp wird derzeit nur auf Unix-Systemen verwendet, die keine monotonen Uhren unterstützen (siehe unten).
Dies ist die einzige nicht-monotone Uhr, die QElapsedTimer verwenden kann.
MonotoneUhr
Dies ist die monotone Uhr des Systems, ausgedrückt in Millisekunden seit einem beliebigen Zeitpunkt in der Vergangenheit. Dieser Uhrentyp wird auf Unix-Systemen verwendet, die monotone POSIX-Uhren unterstützen (_POSIX_MONOTONIC_CLOCK
).
MachAbsoluteTime
Dieser Uhrentyp basiert auf der absoluten Zeit, die von Mach-Kerneln, wie z. B. unter macOS, dargestellt wird. Dieser Uhrentyp wird getrennt von MonotonicClock vorgestellt, da macOS und iOS ebenfalls Unix-Systeme sind und möglicherweise eine monotone POSIX-Uhr mit von der absoluten Mach-Zeit abweichenden Werten unterstützen.
Diese Uhr ist monoton.
Leistungszähler
Diese Uhr verwendet die Windows-Funktionen QueryPerformanceCounter
und QueryPerformanceFrequency
, um auf den Leistungszähler des Systems zuzugreifen.
Diese Uhr ist monoton.
Siehe auch clockType() und isMonotonic().
[alias]
QElapsedTimer::Duration
Synonym für std::chrono::nanoseconds
.
[alias]
QElapsedTimer::TimePoint
Synonym für std::chrono::time_point<std::chrono::steady_clock, Duration>
.
Dokumentation der Mitgliederfunktionen
[constexpr noexcept]
QElapsedTimer::QElapsedTimer()
Konstruiert einen ungültigen QElapsedTimer. Ein Timer wird gültig, sobald er gestartet wurde.
Siehe auch isValid() und start().
[static noexcept]
QElapsedTimer::ClockType QElapsedTimer::clockType()
Gibt den Uhrentyp zurück, den diese QElapsedTimer Implementierung verwendet.
Seit Qt 6.6 verwendet QElapsedTimer std::chrono::steady_clock
, daher ist der Uhrentyp immer MonotonicClock.
Siehe auch isMonotonic().
[noexcept, since 6.6]
QElapsedTimer::Duration QElapsedTimer::durationElapsed() const
Gibt eine std::chrono::nanoseconds
mit der Zeit seit dem letzten Start dieser QElapsedTimer zurück.
Der Aufruf dieser Funktion mit einer QElapsedTimer, die ungültig ist, führt zu undefiniertem Verhalten.
Auf Plattformen, die keine Nanosekunden-Auflösung bieten, ist der zurückgegebene Wert die beste verfügbare Schätzung.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch start(), restart(), hasExpired(), und invalidate().
[noexcept, since 6.6]
QElapsedTimer::Duration QElapsedTimer::durationTo(const QElapsedTimer &other) const
Gibt die Zeitdifferenz zwischen diesem QElapsedTimer und other als std::chrono::nanoseconds
zurück. Wenn other vor diesem Objekt gestartet wurde, ist der zurückgegebene Wert negativ. Wenn es später gestartet wurde, ist der Rückgabewert positiv.
Der Rückgabewert ist undefiniert, wenn dieses Objekt oder other ungültig gemacht wurden.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch secsTo() und elapsed().
[noexcept]
qint64 QElapsedTimer::elapsed() const
Gibt die Anzahl der Millisekunden seit dem letzten Start dieser QElapsedTimer zurück.
Der Aufruf dieser Funktion mit einer QElapsedTimer, die ungültig ist, führt zu undefiniertem Verhalten.
Siehe auch start(), restart(), hasExpired(), isValid(), und invalidate().
[noexcept]
bool QElapsedTimer::hasExpired(qint64 timeout) const
Gibt true
zurück, wenn elapsed() den angegebenen Wert timeout überschreitet, andernfalls false
.
Ein negatives timeout wird als unendlich interpretiert, so dass in diesem Fall false
zurückgegeben wird. Andernfalls ist dies äquivalent zu elapsed() > timeout
. Sie können dasselbe für eine Dauer tun, indem Sie durationElapsed() mit einer Zeitüberschreitung für die Dauer vergleichen.
Siehe auch elapsed() und QDeadlineTimer.
[noexcept]
void QElapsedTimer::invalidate()
Markiert dieses QElapsedTimer Objekt als ungültig.
Ein ungültiges Objekt kann mit isValid() überprüft werden. Berechnungen der Zeit, die seit ungültigen Daten verstrichen ist, sind undefiniert und werden wahrscheinlich bizarre Ergebnisse liefern.
Siehe auch isValid(), start(), und restart().
[static noexcept]
bool QElapsedTimer::isMonotonic()
Gibt true
zurück, wenn dies eine monotone Uhr ist, andernfalls false. Siehe die Informationen über die verschiedenen Uhrentypen, um zu verstehen, welche monoton sind.
Seit Qt 6.6 verwendet QElapsedTimer std::chrono::steady_clock
, so dass diese Funktion nun immer true zurückgibt.
Siehe auch clockType() und QElapsedTimer::ClockType.
[noexcept]
bool QElapsedTimer::isValid() const
Gibt false
zurück, wenn der Zeitgeber nie gestartet oder durch einen Aufruf von invalidate() ungültig gemacht wurde.
Siehe auch invalidate(), start(), und restart().
[noexcept]
qint64 QElapsedTimer::msecsSinceReference() const
Gibt die Anzahl der Millisekunden zwischen dem letzten Start dieses QElapsedTimer Objekts und dem Start seiner Referenzuhr zurück.
Diese Zahl ist normalerweise willkürlich für alle Uhren außer der QElapsedTimer::SystemTime Uhr. Für diesen Uhrentyp ist diese Zahl die Anzahl der Millisekunden seit dem 1. Januar 1970 um 0:00 UTC (d.h. es ist die Unix-Zeit in Millisekunden).
Auf Linux-, Windows- und Apple-Plattformen ist dieser Wert in der Regel die Zeit seit dem Systemstart, wobei die Zeit, die das System im Ruhezustand verbracht hat, normalerweise nicht berücksichtigt wird.
Siehe auch clockType() und elapsed().
[noexcept]
qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
Gibt die Anzahl der Millisekunden zwischen diesem QElapsedTimer und other zurück. Wenn other vor diesem Objekt gestartet wurde, ist der zurückgegebene Wert negativ. Wurde es später gestartet, ist der Rückgabewert positiv.
Der Rückgabewert ist undefiniert, wenn dieses Objekt oder other ungültig gemacht wurden.
Siehe auch secsTo() und elapsed().
[noexcept]
qint64 QElapsedTimer::nsecsElapsed() const
Gibt die Anzahl der Nanosekunden seit dem letzten Start dieser QElapsedTimer zurück.
Der Aufruf dieser Funktion mit einer ungültigen QElapsedTimer führt zu einem undefinierten Verhalten.
Auf Plattformen, die keine Nanosekunden-Auflösung bieten, ist der zurückgegebene Wert die beste verfügbare Schätzung.
Siehe auch start(), restart(), hasExpired(), und invalidate().
[noexcept]
qint64 QElapsedTimer::restart()
Startet den Zeitgeber neu und gibt die Anzahl der seit dem letzten Start verstrichenen Millisekunden zurück. Diese Funktion entspricht der Ermittlung der verstrichenen Zeit mit elapsed() und dem erneuten Starten des Zeitgebers mit start(), allerdings in einem einzigen Vorgang, so dass der Zeitwert nicht zweimal ermittelt werden muss.
Der Aufruf dieser Funktion mit einer ungültigen QElapsedTimer führt zu einem undefinierten Verhalten.
Das folgende Beispiel veranschaulicht, wie diese Funktion verwendet werden kann, um einen Parameter für eine langsame Operation (z. B. eine Iterationszahl) so zu kalibrieren, dass diese Operation mindestens 250 Millisekunden dauert:
QElapsedTimer timer; int count = 1; timer.start(); do { count *= 2; slowOperation2(count); } while (timer.restart() < 250); return count;
Siehe auch start(), invalidate(), elapsed(), und isValid().
[noexcept]
qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const
Gibt die Anzahl der Sekunden zwischen diesem QElapsedTimer und other zurück. Wenn other vor diesem Objekt gestartet wurde, ist der zurückgegebene Wert negativ. Wurde es später gestartet, ist der Rückgabewert positiv.
Der Aufruf dieser Funktion auf oder mit einer QElapsedTimer, die ungültig ist, führt zu undefiniertem Verhalten.
Siehe auch msecsTo() und elapsed().
[noexcept]
void QElapsedTimer::start()
Startet diesen Zeitgeber. Nach dem Start kann der Wert des Timers mit elapsed() oder msecsSinceReference() überprüft werden.
Normalerweise wird ein Timer kurz vor einer längeren Operation gestartet, wie z.B.:
QElapsedTimer timer; timer.start(); slowOperation1(); qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
Auch das Starten eines Timers macht ihn wieder gültig.
Siehe auch restart(), invalidate(), und elapsed().
Verwandte Nicht-Mitglieder
[noexcept]
bool operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Gibt true
zurück, wenn lhs und rhs unterschiedliche Zeiten enthalten, andernfalls false.
[noexcept]
bool operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Gibt true
zurück, wenn lhs vor rhs gestartet wurde, andernfalls false.
Der Rückgabewert ist undefiniert, wenn einer der beiden Parameter ungültig ist und der andere nicht. Zwei ungültige Zeitgeber sind jedoch gleich, so dass diese Funktion false zurückgibt.
[noexcept]
bool operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Gibt true
zurück, wenn lhs und rhs die gleiche Zeit enthalten, andernfalls false.
© 2025 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.