QElapsedTimer Class
Die Klasse „QElapsedTimer“ bietet eine schnelle Möglichkeit, die verstrichene Zeit zu berechnen. Mehr...
| Header: | #include <QElapsedTimer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Hinweis: Alle Funktionen dieser Klasse sind reentrant.
Vergleiche mit QElapsedTimer
| Kategorie | Vergleichbare Typen |
|---|---|
| strong | QElapsedTimer |
Ö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) |
Ausführliche Beschreibung
Die Klasse „QElapsedTimer“ wird in der Regel verwendet, um schnell zu berechnen, wie viel Zeit zwischen zwei Ereignissen verstrichen ist. Ihre API ähnelt der von „ QTime “, sodass Code, der diese verwendet hat, schnell auf die neue Klasse portiert werden kann.
Im Gegensatz zu QTime versucht QElapsedTimer jedoch, nach Möglichkeit monotone Uhren zu verwenden. Das bedeutet, dass es nicht möglich ist, QElapsedTimer-Objekte in eine für Menschen lesbare Zeit umzuwandeln.
Der typische Anwendungsfall für die Klasse besteht darin, zu ermitteln, wie viel Zeit für einen langsamen Vorgang aufgewendet wurde. Das einfachste Beispiel hierfür dient zu Debugging-Zwecken, wie im folgenden Beispiel gezeigt:
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 mit der Funktion ` elapsed()` berechnet.
Die verstrichene Zeit kann auch verwendet werden, um die für einen weiteren Vorgang verfügbare Zeit neu zu berechnen, nachdem der erste Vorgang abgeschlossen ist. Dies ist nützlich, wenn die Ausführung innerhalb eines bestimmten Zeitraums abgeschlossen sein muss, aber mehrere Schritte erforderlich sind. Die Funktionen vom Typ „ waitFor “ in „ QIODevice “ und dessen 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 weiterer Anwendungsfall ist die Ausführung einer bestimmten Operation für einen bestimmten Zeitabschnitt. Hierfür stellt QElapsedTimer die Hilfsfunktion ` hasExpired()` zur Verfügung, mit der festgestellt werden kann, ob bereits eine bestimmte Anzahl von Millisekunden verstrichen ist:
void executeOperationsForTime(int ms)
{
QElapsedTimer timer;
timer.start();
while (!timer.hasExpired(ms))
slowOperation1();
}In diesem Fall ist es oft praktischer, ` QDeadlineTimer ` zu verwenden, da diese Funktion die verbleibende Zeit bis zu einem zukünftigen Timeout zählt, anstatt die bereits verstrichene Zeit zu erfassen.
Referenzuhren
QElapsedTimer verwendet auf allen Plattformen, die dies unterstützen, die monotone Referenzuhr der Plattform (siehe QElapsedTimer::isMonotonic()). Dies hat den zusätzlichen Vorteil, dass QElapsedTimer unempfindlich gegenüber Zeitanpassungen ist, beispielsweise wenn der Benutzer die Uhrzeit korrigiert. Im Gegensatz zu QTime ist QElapsedTimer zudem unempfindlich gegenüber Änderungen der Zeitzoneneinstellungen, wie z. B. der Umstellung auf Sommerzeit.
Andererseits bedeutet dies, dass Werte von `QElapsedTimer` nur mit anderen Werten verglichen werden können, die dieselbe Referenz verwenden. Dies gilt insbesondere dann, wenn die seit der Referenz verstrichene Zeit aus dem QElapsedTimer-Objekt extrahiert (QElapsedTimer::msecsSinceReference())) und serialisiert wird. Diese Werte sollten niemals über das Netzwerk ausgetauscht oder auf Festplatte gespeichert werden, da nicht feststellbar ist, ob der Computerknoten, der die Daten empfängt, derselbe ist wie der, von dem sie stammen, oder ob er inzwischen neu gestartet wurde.
Es ist jedoch möglich, den Wert mit anderen Prozessen auszutauschen, die auf demselben Rechner laufen, vorausgesetzt, diese verwenden ebenfalls dieselbe Referenzuhr. QElapsedTimer verwendet immer dieselbe Uhr, sodass ein Vergleich mit dem Wert eines anderen Prozesses auf demselben Rechner unbedenklich ist. Beim Vergleich mit Werten, die von anderen APIs erzeugt wurden, sollten Sie überprüfen, ob die verwendete Uhr mit der von QElapsedTimer übereinstimmt (siehe QElapsedTimer::clockType()).
Siehe auch QTime, QChronoTimer und QDeadlineTimer.
Dokumentation zu Mitgliedstypen
enum QElapsedTimer::ClockType
Diese Enumeration enthält die verschiedenen Uhrentypen, die von „ QElapsedTimer “ verwendet werden können.
QElapsedTimer verwendet auf einem bestimmten Rechner immer denselben Taktgebertyp, sodass sich dieser Wert während der Laufzeit eines Programms nicht ändert. Er wird bereitgestellt, damit „ QElapsedTimer “ mit anderen, nicht auf Qt basierenden Implementierungen verwendet werden kann, um sicherzustellen, dass derselbe Referenztaktgeber verwendet wird.
| Konstante | Wert | Beschreibung |
|---|---|---|
QElapsedTimer::SystemTime | 0 | Die für Menschen lesbare Systemzeit. Diese Uhr ist nicht monoton. |
QElapsedTimer::MonotonicClock | 1 | Die monotone Systemuhr, die üblicherweise 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-Kernels (macOS und iOS). Diese Uhr ist monoton. |
QElapsedTimer::PerformanceCounter | 4 | Der von Windows bereitgestellte Leistungszähler. Diese Uhr ist monoton. |
SystemTime
Die Systemzeituhr gibt ausschließlich die Echtzeit an, ausgedrückt in Millisekunden seit dem 1. Januar 1970 um 0:00 Uhr UTC. Sie entspricht dem Wert, der von der C- und POSIX-Funktion „ time “ zurückgegeben wird, zuzüglich der Millisekunden. Dieser Uhrtyp wird derzeit nur auf Unix-Systemen verwendet, die keine monotonen Uhren unterstützen (siehe unten).
Dies ist die einzige nicht-monotone Uhr, die von „ QElapsedTimer “ verwendet werden darf.
MonotonicClock
Dies ist die monotone Uhr des Systems, ausgedrückt in Millisekunden seit einem beliebigen Zeitpunkt in der Vergangenheit. Dieser Uhrtyp wird auf Unix-Systemen verwendet, die monotone POSIX-Uhren (_POSIX_MONOTONIC_CLOCK) unterstützen.
MachAbsoluteTime
Dieser Uhrtyp basiert auf der absoluten Zeit, wie sie von Mach-Kerneln bereitgestellt wird, beispielsweise unter macOS. Dieser Uhrtyp wird getrennt von `MonotonicClock` aufgeführt, da macOS und iOS ebenfalls Unix-Systeme sind und möglicherweise eine POSIX-monotone Uhr mit Werten unterstützen, die von der absoluten Mach-Zeit abweichen.
Diese Uhr ist monoton.
PerformanceCounter
Diese Uhr nutzt 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 Member-Funktionen
[constexpr noexcept default] QElapsedTimer::QElapsedTimer()
Erstellt einen ungültigen QElapsedTimer. Ein Timer wird erst gültig, sobald er gestartet wurde.
Siehe auch isValid() und start().
[static noexcept] QElapsedTimer::ClockType QElapsedTimer::clockType()
Gibt den Uhrtyp zurück, den diese Implementierung von ` QElapsedTimer ` verwendet.
Seit Qt 6.6 verwendet „ QElapsedTimer “ „ std::chrono::steady_clock “, sodass der Uhrentyp immer „ MonotonicClock “ ist.
Siehe auch ` isMonotonic()`.
[noexcept, since 6.6] QElapsedTimer::Duration QElapsedTimer::durationElapsed() const
Gibt einen ` std::chrono::nanoseconds ` zurück, der die Zeit seit dem letzten Start dieses ` QElapsedTimer ` enthält.
Der Aufruf dieser Funktion für einen ungültigen „ QElapsedTimer “ führt zu undefiniertem Verhalten.
Auf Plattformen, die keine Auflösung im Nanosekundenbereich bieten, entspricht der zurückgegebene Wert der bestmöglichen 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 Rückgabewert 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.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch „ secsTo()“ und „ elapsed()“.
[noexcept] qint64 QElapsedTimer::elapsed() const
Gibt die Anzahl der Millisekunden zurück, die seit dem letzten Start dieses „ QElapsedTimer “ vergangen sind.
Der Aufruf dieser Funktion bei einem ungültigen ` QElapsedTimer ` 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 negativer Wert für „ timeout “ wird als unendlich interpretiert, sodass in diesem Fall „ false “ zurückgegeben wird. Andernfalls entspricht dies „ elapsed() > timeout “. Dasselbe können Sie für eine Dauer tun, indem Sie „ durationElapsed()“ mit einem Zeitlimit 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 seit dem Auftreten der ungültigen Daten verstrichenen Zeit sind undefiniert und führen wahrscheinlich zu seltsamen Ergebnissen.
Siehe auch „ isValid()“, „ start()“ und „ restart()“.
[static noexcept] bool QElapsedTimer::isMonotonic()
Gibt „ true “ zurück, wenn es sich um eine monotone Uhr handelt, andernfalls „false“. In den Informationen zu den verschiedenen Uhrentypen erfahren Sie, welche davon monoton sind.
Seit Qt 6.6 verwendet ` QElapsedTimer ` ` std::chrono::steady_clock`, sodass diese Funktion nun immer „true“ zurückgibt.
Siehe auch „ clockType()“ und „ QElapsedTimer::ClockType “.
[noexcept] bool QElapsedTimer::isValid() const
Gibt „ false “ zurück, wenn der Timer noch 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.
Dieser Wert ist in der Regel für alle Uhren außer der „ QElapsedTimer::SystemTime “-Uhr beliebig. Bei diesem Uhrentyp entspricht dieser Wert der Anzahl der Millisekunden seit dem 1. Januar 1970 um 0:00 Uhr UTC (das heißt, es handelt sich um die in Millisekunden ausgedrückte Unix-Zeit).
Auf Linux-, Windows- und Apple-Plattformen entspricht dieser Wert in der Regel der Zeit seit dem Systemstart, wobei die Zeit, die das System in Ruhezuständen 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. Wenn es später gestartet wurde, ist der zurückgegebene Wert 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 dieses „ QElapsedTimer “ zurück.
Der Aufruf dieser Funktion für einen ungültigen ` QElapsedTimer ` führt zu undefiniertem Verhalten.
Auf Plattformen, die keine Nanosekundenauflösung bieten, entspricht der zurückgegebene Wert der bestmöglichen Schätzung.
Siehe auch start(), restart(), hasExpired() und invalidate().
[noexcept] qint64 QElapsedTimer::restart()
Setzt den Timer zurück und gibt die Anzahl der Millisekunden zurück, die seit dem letzten Start verstrichen sind. Diese Funktion entspricht dem Abrufen der verstrichenen Zeit mit ` elapsed()` und dem anschließenden Neustart des Timers mit ` start()`, führt dies jedoch in einem einzigen Schritt durch, wodurch das zweimalige Abrufen des Uhrwerts entfällt.
Der Aufruf dieser Funktion mit einem ungültigen ` QElapsedTimer ` führt zu undefiniertem Verhalten.
Das folgende Beispiel veranschaulicht, wie diese Funktion verwendet wird, um einen Parameter an eine langsame Operation (z. B. eine Iterationsanzahl) anzupassen, sodass 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. Wenn es später gestartet wurde, ist der zurückgegebene Wert positiv.
Der Aufruf dieser Funktion für oder mit einem ungültigen ` QElapsedTimer ` führt zu undefiniertem Verhalten.
Siehe auch msecsTo() und elapsed().
[noexcept] void QElapsedTimer::start()
Startet diesen Timer. Nach dem Start kann der Timer-Wert mit ` elapsed()` oder ` msecsSinceReference()` abgefragt werden.
Normalerweise wird ein Timer unmittelbar vor einem langwierigen Vorgang gestartet, beispielsweise:
QElapsedTimer timer;
timer.start();
slowOperation1();
qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";Außerdem wird der Timer durch das Starten wieder gültig.
Siehe auch restart(), invalidate() und elapsed().
Verwandte Themen für Nichtmitglieder
[noexcept] bool operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Gibt „ true “ zurück, wenn „ lhs “ und „ rhs “ unterschiedliche Zeitangaben 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, der andere jedoch nicht. Zwei ungültige Timer sind jedoch gleich, sodass diese Funktion „false“ zurückgibt.
[noexcept] bool operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Gibt „ true “ zurück, wenn „ lhs “ und „ rhs “ denselben Zeitpunkt enthalten, andernfalls „false“.
© 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.