QChronoTimer Class

QChronoTimerクラスは、繰り返しタイマーとシングル・ショット・タイマーを提供します。詳細...

ヘッダー #include <QChronoTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
以来:Qt 6.8
継承: QObject

プロパティ

パブリック機能

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

パブリックスロット

void start()
void stop()

シグナル

void timeout()

再実装された保護された関数

virtual void timerEvent(QTimerEvent *e) override

詳細説明

QChronoTimerクラスはタイマーのハイレベルプログラミングインタフェースを提供します。使用するには、コンストラクタにインターバルを渡すか、コンストラクタの後にsetInterval() を使用してインターバルを設定し、timeout() シグナルを適切なスロットに接続し、start() を呼び出します。それ以降、一定の間隔でtimeout() シグナルが発せられます。例えば

        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();

setSingleShot(true)を呼び出すことで、タイマーを一度だけタイムアウトするように設定できます。

注: QChronoTimerにはsingleShot()スタティック・メソッドがありません。QTimer のメソッドはすでにクロノ型とナノ秒分解能で動作しているからです。

マルチスレッド・アプリケーションでは、イベント・ループを持つどのスレッドでもQChronoTimerを使うことができます。非GUIスレッドからイベントループを開始するには、QThread::exec ()を使用します。Qtはタイマーのthread affinity 、どのスレッドがtimeout()シグナルを発信するかを決定します。このため、そのスレッドでタイマーを開始および停止する必要があります。他のスレッドからタイマーを開始することはできません。

他のスレッドからタイマーを開始することはできません。特別なケースとして、タイムアウトが0ns のQChronoTimerは、できるだけ早くタイムアウトします。ただし、ゼロタイマーと他のイベント・ソースとの順序は指定されていません。ゼロタイマーは、応答性の良いユーザーインターフェイスを提供しながら、いくつかの作業を行うために使用することができます:

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

それ以降、processOneThing() が繰り返し呼び出される。それ以降、 は繰り返し呼び出されます。Qt がユーザーインターフェースにイベントを配信し、すべての処理を終えるとすぐにタイマーを停止できるように、タイマーは常に素早く(例えば、1 つのデータアイテムを処理した後に)戻るように記述する必要があります。これはGUIアプリケーションで重い処理を実装する伝統的な方法ですが、マルチスレッドがより多くのプラットフォームで利用できるようになってきているため、GUI(メイン)スレッド以外のスレッドで重い処理を行うのが現代的な代替方法です。QtにはQThread というクラスがあり、これを使うことで実現できます。

精度とタイマーの分解能

タイマーの精度は、基盤となるオペレーティング・システムとハードウェアに依存します。ほとんどのプラットフォームは、タイマーにナノ秒の精度を要求することをサポートしています(例えば、libcのnanosleep )が、タイマーの精度は多くの実世界の状況ではこの分解能に等しくありません。

QChronoTimerにどの精度をシステムから要求するかを伝えるために、timer type を設定することができます。

Qt::PreciseTimer の場合、QChronoTimer は精度を1ns に保とうとします。高精度タイマーは予想より早くタイムアウトすることはありません。

Qt::CoarseTimerQt::VeryCoarseTimer タイプの場合、QChronoTimer はこれらのタイプのマージンの範囲内で、予想より早く目覚める可能性があります:

システムがビジー状態であったり、要求された精度を提供できない場合、すべてのタイマー・タイプは予想より遅れてタイムアウトする可能性がある。このようなタイムアウト・オーバーランの場合、Qt はtimeout() を一度だけ、たとえ複数のタイムアウトがあったとしても出します。

QChronoTimerの代替

QChronoTimerはナノ秒の分解能と±292年の範囲を提供します(間隔がstd::numeric_limits<int>::max() より長い場合、整数オーバーフローの可能性が低くなります)。ミリ秒の分解能と±24日の範囲しか必要ない場合は、従来のQTimer

別の方法としては、QObject::timerEvent() メソッドをあなたのクラス(QObject のサブクラスでなければなりません)に再実装し、以下のアプローチのいずれかを使用する方法があります:

  • タイマー ID をラップする軽量値クラス、QBasicTimer を使用する。QBasicTimer::start() でタイマーを開始し、QBasicTimer::stop() でタイマーを停止します。イベントを処理するには、timerEvent() を使用します。
  • より低レベルな方法は、タイマーIDを直接操作することです。タイマーを開始するには、QObject::startTimer ()を呼び、返されたIDを保存する。タイマーを停止するには、QObject::killTimer ()を呼び出す。再実装したtimerEvent ()でイベントを処理できる。この方法は通常、QBasicTimer を使用するよりも面倒である。

timerEvent() を使用することの欠点は、シングル・ショット・タイマーやシグナ ルなどの高レベルの機能がサポートされていないことである。

オペレーティングシステムによっては、使用できるタイマーの数が制限されています。

QBasicTimer,QTimerEvent,QObject::timerEvent(),Timers,Analog Clockも参照してください

プロパティのドキュメント

[bindable read-only] active : bool

注: このプロパティは、QProperty バインディングをサポートしている。

この boolean プロパティは、タイマーが実行中の場合はtrue となり、そうでない場合はfalse となる。

[bindable] interval : std::chrono::nanoseconds

注意: このプロパティはQProperty バインディングに対応しています。

このプロパティは、タイムアウト間隔を保持します。

このプロパティのデフォルト値は0ns です。

タイムアウトが0nsQChronoTimer は、ウィンドウシステムのイベントキュー内のすべてのイベントが処理されるとすぐにタイムアウトします。

実行中のタイマーのインターバルを設定すると、インターバルが変更され、stop ()、次にstart ()、新しいid ()を取得する。タイマーが実行中でない場合は、インターバルのみが変更される。

singleShotも参照のこと

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

このプロパティは残り時間を保持する

タイムアウトまでの残り時間を返す。

タイマーが非アクティブの場合、返される継続時間は負になります。

タイマーが期限切れの場合、返される継続時間は0ns となります。

アクセス関数:

std::chrono::nanoseconds remainingTime() const

intervalも参照

[bindable] singleShot : bool

注: このプロパティは、QProperty バインディングをサポートしています。

このプロパティは、タイマーがシングルショットタイマーであるかどうかを保持します。

シングルショットタイマーは一度だけ発火し、シングルショットタイマーでないタイマーはinterval 毎に発火します。

このプロパティのデフォルト値はfalse です。

intervalも参照してください

[bindable] timerType : Qt::TimerType

注: このプロパティは、QProperty バインディングをサポートしています。

タイマーの精度を制御する

このプロパティのデフォルト値はQt::CoarseTimer です。

Qt::TimerTypeも参照のこと

メンバ関数ドキュメント

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

与えられたparent でタイマーを構築し、デフォルトの間隔0ns を使用する。

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

与えられたparent で、nsec のインターバルを使ってタイマーを構築する。

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

タイマーを破壊する。

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

この関数はcallOnTimeout()をオーバーロードする。

context の特定のイベント・ループに配置されるslot へのtimeout() シグナルからの接続を、接続タイプconnectionType で作成し、その接続へのハンドルを返す。

このメソッドは便宜上提供されている。呼び出しと同じです:

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

QObject::connect() およびtimeout()も参照

Qt::TimerId QChronoTimer::id() const

タイマーが実行中であればタイマーIDを表すQt::TimerId を返し、そうでなければQt::TimerId::Invalid を返す。

Qt::TimerIdも参照のこと

bool QChronoTimer::isActive() const

タイマーが動作中であればtrue を返し、そうでなければfalse を返す。

注: プロパティ用ゲッター関数active

[slot] void QChronoTimer::start()

この関数は start()をオーバーロードする。

interval で指定されたタイムアウトでタイマーを開始または再起動する。

タイマーがすでに動作している場合は、stopped 、再起動される。また、id ()も変更される。

singleShot がtrueの場合、タイマーは1回だけ起動します。

[slot] void QChronoTimer::stop()

タイマーを停止する。

start()も参照

[private signal] void QChronoTimer::timeout()

このシグナルはタイマーがタイムアウトしたときに発せられる。

注意: これはプライベート・シグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

intervalstart()、stop()も参照のこと

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

再実装: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.