QChronoTimer Class

Die Klasse QChronoTimer bietet Zeitgeber für Wiederholungen und Einzelschüsse. 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
Vererbt: QObject

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

void start()
void stop()

Signale

void timeout()

Reimplementierte geschützte Funktionen

virtual void timerEvent(QTimerEvent *e) override

Detaillierte Beschreibung

Die Klasse QChronoTimer bietet eine High-Level-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 Konstruktion mit setInterval() einstellen, sein timeout()-Signal mit den entsprechenden Slots verbinden und start() aufrufen. Von da an wird das Signal timeout() in konstanten Abständen ausgegeben. Ein Beispiel:

        QChronoTimer *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 hat keine statischen singleShot()-Methoden, da die Methoden auf QTimer bereits mit Chrono-Typen und Nanosekunden-Auflösung arbeiten.

In Multithread-Anwendungen können Sie QChronoTimer in jedem Thread verwenden, der eine Ereignisschleife hat. Um eine Ereignisschleife von einem Nicht-GUI-Thread zu starten, verwenden Sie QThread::exec(). Qt verwendet die thread affinity des Timers, um zu bestimmen, welcher Thread das timeout()-Signal ausgeben wird. Aus diesem Grund müssen Sie den Timer in seinem Thread starten und stoppen; es ist nicht möglich, einen Timer von einem anderen Thread aus zu starten.

Als Sonderfall wird ein QChronoTimer mit einem Timeout von 0ns so schnell wie möglich ablaufen, obwohl die Reihenfolge zwischen Null-Timern und anderen Ereignisquellen nicht spezifiziert ist. Null-Timer können verwendet werden, um etwas Arbeit zu erledigen und gleichzeitig eine ansprechende Benutzeroberfläche zu bieten:

        // The default interval is 0ns
        QChronoTimer *timer = new QChronoTimer(this);
        connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
        timer->start();

Von da an wird processOneThing() wiederholt aufgerufen. Er sollte so geschrieben sein, dass er immer schnell zurückkehrt (zum Beispiel nach der Verarbeitung eines Datenelements), damit Qt Ereignisse an die Benutzeroberfläche liefern und den Timer stoppen kann, sobald er seine Arbeit erledigt hat. Dies ist die traditionelle Art, schwere Arbeit in GUI-Anwendungen zu implementieren, aber da Multithreading auf immer mehr Plattformen verfügbar wird, ist eine moderne Alternative, die schwere Arbeit 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 Timer-Auflösung

Die Genauigkeit von Timern hängt vom zugrunde liegenden Betriebssystem und der Hardware ab. Die meisten Plattformen unterstützen die Abfrage von Nano-Sekunden-Präzision für Timer (z.B. libc's nanosleep), obwohl die Genauigkeit des Timers in vielen realen Situationen nicht dieser Auflösung entsprechen wird.

Sie können timer type setzen, um QChronoTimer mitzuteilen, welche Genauigkeit vom System angefordert werden soll.

Für Qt::PreciseTimer wird QChronoTimer versuchen, die Genauigkeit bei 1ns zu halten. Präzise Zeitgeber werden niemals früher als erwartet ablaufen.

Bei den Typen Qt::CoarseTimer und Qt::VeryCoarseTimer kann QChronoTimer innerhalb der für diese Typen geltenden Spannen früher als erwartet aufwachen:

Alle Timer-Typen können später als erwartet ablaufen, wenn das System ausgelastet ist oder nicht in der Lage ist, die geforderte Genauigkeit zu liefern. In einem solchen Fall von Timeout-Überschreitung gibt Qt timeout() nur einmal aus, auch wenn mehrere Timeouts 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 Integer-Überlaufs, wenn das Intervall länger als std::numeric_limits<int>::max() ist). Wenn Sie nur eine Millisekundenauflösung und einen Bereich von ±24 Tagen benötigen, können Sie weiterhin die klassische Klasse QTimer verwenden.

Eine andere Alternative ist die Neuimplementierung der Methode QObject::timerEvent() in Ihrer Klasse (die eine Unterklasse von QObject sein muss) und die Verwendung eines der folgenden Ansätze:

  • Verwendung von QBasicTimer, einer leichtgewichtigen Value-Klasse, die eine Timer-ID umhüllt. Sie können den Timer mit QBasicTimer::start() starten und ihn mit QBasicTimer::stop() stoppen. Sie können das Ereignis in Ihrem reimplemneted timerEvent() behandeln.
  • Eine einfachere Methode ist die direkte Manipulation der Timer-IDs. Um den Timer zu starten, rufen Sie QObject::startTimer() auf und speichern die zurückgegebene ID. Um den Timer zu stoppen, rufen Sie QObject::killTimer() auf. Sie können das Ereignis in Ihrem reimplementierten timerEvent() behandeln. Dieser Ansatz ist in der Regel mühsamer als die Verwendung von QBasicTimer.

Ein Nachteil der Verwendung von timerEvent() ist, dass einige High-Level-Funktionen, wie Single-Shot-Timer und Signale, nicht unterstützt werden.

Einige Betriebssysteme beschränken die Anzahl der Timer, die verwendet werden können; Qt tut sein Bestes, um diese Beschränkungen zu umgehen.

Siehe auch QBasicTimer, QTimerEvent, QObject::timerEvent(), Timer, und Analog Clock.

Dokumentation der 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.

[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 einer Zeitüberschreitung von 0ns läuft aus, sobald alle Ereignisse in der Ereigniswarteschlange des Fenstersystems abgearbeitet wurden.

Das Einstellen des Intervalls eines laufenden Timers ändert das Intervall, stop() und dann start() den Timer und erfasst ein neues id(). Wenn der Timer nicht läuft, wird nur das Intervall geändert.

Siehe auch singleShot.

[read-only] remainingTime : const std::chrono::nanoseconds

Diese Eigenschaft enthält die verbleibende Zeit

Gibt die verbleibende Zeit bis zur Zeitüberschreitung zurück.

Wenn der Zeitgeber inaktiv ist, ist die zurückgegebene Dauer negativ.

Ist der Timer überfällig, lautet 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 Zeitgeber um einen einmaligen Zeitgeber handelt.

Ein Single-Shot-Timer wird nur einmal ausgelöst, Nicht-Single-Shot-Timer werden alle interval ausgelöst.

Der Standardwert für diese Eigenschaft ist false.

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.

Siehe auch Qt::TimerType.

Dokumentation der Mitgliedsfunktionen

[explicit] QChronoTimer::QChronoTimer(QObject *parent = nullptr)

Konstruiert einen Timer mit dem angegebenen parent, wobei das Standardintervall 0ns verwendet wird.

[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)

Konstruiert einen Timer mit dem angegebenen parent, der ein Intervall von nsec verwendet.

[override virtual noexcept] QChronoTimer::~QChronoTimer()

Zerstört den Timer.

template <typename Functor> QMetaObject::Connection QChronoTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)

Diese Funktion überlastet callOnTimeout().

Erstellt eine Verbindung vom Signal timeout() zu slot, die in einer bestimmten Ereignisschleife von context platziert werden soll, mit dem Verbindungstyp connectionType, und gibt ein Handle auf die Verbindung zurück.

Diese Methode wird aus Gründen der Bequemlichkeit bereitgestellt. Sie ist äquivalent zum Aufruf:

QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);

Siehe auch QObject::connect() und timeout().

Qt::TimerId QChronoTimer::id() const

Gibt eine Qt::TimerId zurück, die die Timer-ID darstellt, wenn 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()

Diese Funktion überlastet start().

Startet den Timer oder startet ihn neu mit der in interval angegebenen Zeitüberschreitung.

Wenn der Timer bereits läuft, wird er stopped und neu gestartet. Dies ändert auch seine id().

Wenn singleShot wahr ist, 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, aber nicht vom Benutzer ausgegeben werden.

Siehe auch interval, start(), und stop().

[override virtual protected] void QChronoTimer::timerEvent(QTimerEvent *e)

Reimplements: QObject::timerEvent(QTimerEvent *event).

© 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.