QElapsedTimer Class
La clase QElapsedTimer proporciona una forma rápida de calcular los tiempos transcurridos. Más...
| Cabecera: | #include <QElapsedTimer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Esta clase es fuertemente comparable.
Nota: Todas las funciones de esta clase son reentrantes.
Tipos públicos
| enum | ClockType { SystemTime, MonotonicClock, TickCounter, MachAbsoluteTime, PerformanceCounter } |
| Duration | |
| TimePoint |
Funciones públicas
| 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() |
Miembros públicos estáticos
| QElapsedTimer::ClockType | clockType() |
| bool | isMonotonic() |
Relacionados No Miembros
| bool | operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs) |
| bool | operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs) |
| bool | operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs) |
Descripción detallada
La clase QElapsedTimer se utiliza normalmente para calcular rápidamente cuánto tiempo ha transcurrido entre dos eventos. Su API es similar a la de QTime, por lo que el código que la utilizaba puede ser portado rápidamente a la nueva clase.
Sin embargo, a diferencia de QTime, QElapsedTimer intenta utilizar relojes monotónicos si es posible. Esto significa que no es posible convertir objetos QElapsedTimer a una hora legible por humanos.
El caso de uso típico de la clase es determinar cuánto tiempo se ha empleado en una operación lenta. El ejemplo más simple de tal caso es para propósitos de depuración, como en el siguiente ejemplo:
QElapsedTimer timer; timer.start(); slowOperation1(); qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
En este ejemplo, el temporizador se inicia mediante una llamada a start() y el tiempo transcurrido se calcula mediante la función elapsed().
El tiempo transcurrido también puede utilizarse para recalcular el tiempo disponible para otra operación, una vez finalizada la primera. Esto es útil cuando la ejecución debe completarse dentro de un cierto período de tiempo, pero se necesitan varios pasos. Las funciones de tipo waitFor en QIODevice y sus subclases son buenos ejemplos de tal necesidad. En ese caso, el código podría ser el siguiente:
void executeSlowOperations(int timeout) { QElapsedTimer timer; timer.start(); slowOperation1(); int remainingTime = timeout - timer.elapsed(); if (remainingTime > 0) slowOperation2(remainingTime); }
Otro caso de uso es ejecutar una operación determinada durante un periodo de tiempo específico. Para ello, QElapsedTimer proporciona la función de conveniencia hasExpired(), que se puede utilizar para determinar si un cierto número de milisegundos ya ha transcurrido:
void executeOperationsForTime(int ms) { QElapsedTimer timer; timer.start(); while (!timer.hasExpired(ms)) slowOperation1(); }
A menudo es más conveniente utilizar QDeadlineTimer en este caso, que cuenta hacia un tiempo de espera en el futuro en lugar de realizar un seguimiento del tiempo transcurrido.
Relojes de referencia
QElapsedTimer utilizará el reloj de referencia monotónico de la plataforma en todas las plataformas que lo admitan (consulte QElapsedTimer::isMonotonic()). Esto tiene la ventaja añadida de que QElapsedTimer es inmune a los ajustes de tiempo, como por ejemplo que el usuario corrija la hora. También a diferencia de QTime, QElapsedTimer es inmune a los cambios en la configuración de la zona horaria, como los periodos de ahorro de luz diurna.
Por otro lado, esto significa que los valores de QElapsedTimer sólo pueden compararse con otros valores que utilicen la misma referencia. Esto es especialmente cierto si el tiempo transcurrido desde la referencia se extrae del objeto QElapsedTimer (QElapsedTimer::msecsSinceReference()) y se serializa. Estos valores nunca deben intercambiarse a través de la red ni guardarse en disco, ya que no se sabe si el nodo informático que recibe los datos es el mismo que el que los origina o si se ha reiniciado desde entonces.
Sin embargo, es posible intercambiar el valor con otros procesos que se ejecuten en la misma máquina, siempre que también utilicen el mismo reloj de referencia. QElapsedTimer utilizará siempre el mismo reloj, por lo que es seguro compararlo con el valor procedente de otro proceso en la misma máquina. Si se compara con valores producidos por otras APIs, se debe comprobar que el reloj utilizado es el mismo que el de QElapsedTimer (ver QElapsedTimer::clockType()).
Véase también QTime, QChronoTimer, y QDeadlineTimer.
Documentación de tipos de miembros
enum QElapsedTimer::ClockType
Este enum contiene los diferentes tipos de reloj que QElapsedTimer puede utilizar.
QElapsedTimer utilizará siempre el mismo tipo de reloj en una máquina determinada, por lo que este valor no cambiará durante la vida de un programa. Se proporciona para que QElapsedTimer pueda ser utilizado con otras implementaciones que no sean Qt, para garantizar que se está utilizando el mismo reloj de referencia.
| Constante | Valor | Descripción |
|---|---|---|
QElapsedTimer::SystemTime | 0 | La hora del sistema legible por humanos. Este reloj no es monotónico. |
QElapsedTimer::MonotonicClock | 1 | El reloj monotónico del sistema, normalmente encontrado en sistemas Unix. Este reloj es monotónico. |
QElapsedTimer::TickCounter | 2 | Ya no se utiliza. |
QElapsedTimer::MachAbsoluteTime | 3 | La hora absoluta del núcleo de Mach (macOS e iOS). Este reloj es monotónico. |
QElapsedTimer::PerformanceCounter | 4 | El contador de rendimiento proporcionado por Windows. Este reloj es monotónico. |
SystemTime
El reloj de tiempo del sistema es puramente el tiempo real, expresado en milisegundos desde el 1 de enero de 1970 a las 0:00 UTC. Es equivalente al valor devuelto por la función time de C y POSIX, con los milisegundos añadidos. Este tipo de reloj sólo se utiliza actualmente en sistemas Unix que no soportan relojes monotónicos (ver más abajo).
Este es el único reloj no monotónico que QElapsedTimer puede utilizar.
RelojMonotónico
Este es el reloj monotónico del sistema, expresado en milisegundos desde un punto arbitrario en el pasado. Este tipo de reloj se utiliza en sistemas Unix que soportan relojes monotónicos POSIX (_POSIX_MONOTONIC_CLOCK).
MachAbsoluteTime
Este tipo de reloj se basa en el tiempo absoluto presentado por los núcleos Mach, como el que se encuentra en macOS. Este tipo de reloj se presenta por separado de MonotonicClock ya que macOS e iOS también son sistemas Unix y pueden soportar un reloj monotónico POSIX con valores diferentes de la hora absoluta de Mach.
Este reloj es monotónico.
PerformanceCounter
Este reloj utiliza las funciones de Windows QueryPerformanceCounter y QueryPerformanceFrequency para acceder al contador de rendimiento del sistema.
Este reloj es monótono.
Véase también clockType() y isMonotonic().
[alias] QElapsedTimer::Duration
Sinónimo de std::chrono::nanoseconds.
[alias] QElapsedTimer::TimePoint
Sinónimo de std::chrono::time_point<std::chrono::steady_clock, Duration>.
Documentación de las funciones miembro
[constexpr noexcept] QElapsedTimer::QElapsedTimer()
Construye un QElapsedTimer inválido. Un temporizador pasa a ser válido una vez que se ha iniciado.
Véase también isValid() y start().
[static noexcept] QElapsedTimer::ClockType QElapsedTimer::clockType()
Devuelve el tipo de reloj que utiliza esta implementación de QElapsedTimer.
Desde Qt 6.6, QElapsedTimer utiliza std::chrono::steady_clock, por lo que el tipo de reloj es siempre MonotonicClock.
Véase también isMonotonic().
[noexcept, since 6.6] QElapsedTimer::Duration QElapsedTimer::durationElapsed() const
Devuelve un std::chrono::nanoseconds con la hora desde que este QElapsedTimer se inició por última vez.
Llamar a esta función en un QElapsedTimer que no es válido resulta en un comportamiento indefinido.
En plataformas que no proporcionan resolución de nanosegundos, el valor devuelto será la mejor estimación disponible.
Esta función se introdujo en Qt 6.6.
Véase también start(), restart(), hasExpired() y invalidate().
[noexcept, since 6.6] QElapsedTimer::Duration QElapsedTimer::durationTo(const QElapsedTimer &other) const
Devuelve la diferencia de tiempo entre este QElapsedTimer y other como std::chrono::nanoseconds. Si other se inició antes que este objeto, el valor devuelto será negativo. Si se inició más tarde, el valor devuelto será positivo.
El valor devuelto es indefinido si este objeto o other fueron invalidados.
Esta función se introdujo en Qt 6.6.
Véase también secsTo() y elapsed().
[noexcept] qint64 QElapsedTimer::elapsed() const
Devuelve el número de milisegundos transcurridos desde que este QElapsedTimer se inició por última vez.
Llamar a esta función en un QElapsedTimer que no es válido resulta en un comportamiento indefinido.
Véase también start(), restart(), hasExpired(), isValid() y invalidate().
[noexcept] bool QElapsedTimer::hasExpired(qint64 timeout) const
Devuelve true si elapsed() supera el valor dado timeout, en caso contrario false.
Un timeout negativo se interpreta como infinito, por lo que se devuelve false en este caso. De lo contrario, es equivalente a elapsed() > timeout. Puede hacer lo mismo para una duración comparando durationElapsed() con un tiempo de espera de duración.
Véase también elapsed() y QDeadlineTimer.
[noexcept] void QElapsedTimer::invalidate()
Marca este objeto QElapsedTimer como no válido.
Un objeto inválido puede comprobarse con isValid(). Los cálculos del tiempo transcurrido desde los datos inválidos no están definidos y probablemente producirán resultados extraños.
Véase también isValid(), start(), y restart().
[static noexcept] bool QElapsedTimer::isMonotonic()
Devuelve true si se trata de un reloj monotónico, false en caso contrario. Vea la información sobre los diferentes tipos de reloj para entender cuáles son monotónicos.
Desde Qt 6.6, QElapsedTimer utiliza std::chrono::steady_clock, por lo que esta función ahora siempre devuelve true.
Véase también clockType() y QElapsedTimer::ClockType.
[noexcept] bool QElapsedTimer::isValid() const
Devuelve false si el temporizador nunca ha sido iniciado o invalidado por una llamada a invalidate().
Véase también invalidate(), start() y restart().
[noexcept] qint64 QElapsedTimer::msecsSinceReference() const
Devuelve el número de milisegundos entre la última vez que se inició este objeto QElapsedTimer y el inicio de su reloj de referencia.
Este número suele ser arbitrario para todos los relojes excepto para el reloj QElapsedTimer::SystemTime. Para ese tipo de reloj, este número es el número de milisegundos desde el 1 de enero de 1970 a las 0:00 UTC (es decir, es la hora Unix expresada en milisegundos).
En las plataformas Linux, Windows y Apple, este valor suele ser el tiempo transcurrido desde el arranque del sistema, aunque normalmente no incluye el tiempo que el sistema ha pasado en estados de reposo.
Véase también clockType() y elapsed().
[noexcept] qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
Devuelve el número de milisegundos entre este QElapsedTimer y other. Si other se inició antes que este objeto, el valor devuelto será negativo. Si se inició después, el valor devuelto será positivo.
El valor devuelto es indefinido si este objeto o other fueron invalidados.
Véase también secsTo() y elapsed().
[noexcept] qint64 QElapsedTimer::nsecsElapsed() const
Devuelve el número de nanosegundos transcurridos desde el último inicio de QElapsedTimer.
Llamar a esta función en un QElapsedTimer que no es válido resulta en un comportamiento indefinido.
En plataformas que no proporcionan resolución de nanosegundos, el valor devuelto será la mejor estimación disponible.
Véase también start(), restart(), hasExpired() y invalidate().
[noexcept] qint64 QElapsedTimer::restart()
Reinicia el temporizador y devuelve el número de milisegundos transcurridos desde el inicio anterior. Esta función es equivalente a obtener el tiempo transcurrido con elapsed() y luego iniciar de nuevo el temporizador con start(), pero lo hace en una sola operación, evitando la necesidad de obtener el valor del reloj dos veces.
Llamar a esta función en un QElapsedTimer que no es válido resulta en un comportamiento indefinido.
El siguiente ejemplo ilustra cómo utilizar esta función para calibrar un parámetro de una operación lenta (por ejemplo, un recuento de iteraciones) para que esta operación tarde al menos 250 milisegundos:
QElapsedTimer timer; int count = 1; timer.start(); do { count *= 2; slowOperation2(count); } while (timer.restart() < 250); return count;
Véase también start(), invalidate(), elapsed() y isValid().
[noexcept] qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const
Devuelve el número de segundos entre este QElapsedTimer y other. Si other se inició antes que este objeto, el valor devuelto será negativo. Si se inició más tarde, el valor devuelto será positivo.
Llamar a esta función en o con un QElapsedTimer que no es válido resulta en un comportamiento indefinido.
Véase también msecsTo() y elapsed().
[noexcept] void QElapsedTimer::start()
Inicia este temporizador. Una vez iniciado, el valor del temporizador puede comprobarse con elapsed() o msecsSinceReference().
Normalmente, un temporizador se inicia justo antes de una operación larga, como:
QElapsedTimer timer; timer.start(); slowOperation1(); qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
Además, si se inicia un temporizador, vuelve a ser válido.
Véase también restart(), invalidate() y elapsed().
Relacionados No miembros
[noexcept] bool operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Devuelve true si lhs y rhs contienen horas diferentes, false en caso contrario.
[noexcept] bool operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Devuelve true si lhs se inició antes que rhs, false en caso contrario.
El valor devuelto es indefinido si uno de los dos parámetros es inválido y el otro no. Sin embargo, dos temporizadores inválidos son iguales y por lo tanto esta función devolverá false.
[noexcept] bool operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
Devuelve true si lhs y rhs contienen la misma hora, false en caso contrario.
© 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.