QChronoTimer Class

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

Header: #include <QChronoTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Since: Qt 6.8
Inherits: 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 )が、タイマーの精度は多くの実世界の状況ではこの分解能に等しくありません。

timer type 、QChronoTimerにシステムから要求する精度を指示することができます。

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 および QChronoTimer::singleShot()も参照してください

[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の場合、タイマーは一度だけ起動します。

[slot] void QChronoTimer::stop()

タイマーを停止します。

start()も参照

[private signal] void QChronoTimer::timeout()

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

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

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

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

再実装:QObject::timerEvent(QTimerEvent *event)を参照してください。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。