QElapsedTimer Class

QElapsedTimer クラスは、経過時間を高速に計算する方法を提供します。詳細...

ヘッダー #include <QElapsedTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

このクラスは強く比較可能である。

注意:このクラスの関数はすべてリエントラントです。

パブリック型

enum ClockType { SystemTime, MonotonicClock, TickCounter, MachAbsoluteTime, PerformanceCounter }
Duration
TimePoint

パブリック関数

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

静的パブリックメンバ

QElapsedTimer::ClockType clockType()
bool isMonotonic()
bool operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
bool operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
bool operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs)

詳細説明

QElapsedTimerクラスは通常、2つのイベント間の経過時間を素早く計算するために使用されます。その API はQTime と似ているので、それを使っていたコードは新しいクラスにすぐに移植できます。

しかし、QTime とは異なり、QElapsedTimer は可能な限り単調クロックを使用しようとします。つまり、QElapsedTimerオブジェクトを人間が読める時間に変換することはできません。

このクラスの典型的なユースケースは、遅い操作にどれだけの時間が費やされたかを判断することです。このようなケースの最も単純な例は、次の例のようにデバッグを目的としたものです:

    QElapsedTimertimer; timer.start();
    slowOperation1();

    qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";

この例では、start ()の呼び出しによってタイマーが開始され、elapsed ()関数によって経過時間が計算される。

経過時間は、最初の操作が完了した後に、別の操作に使用できる時間を再計算するために使用することもできる。これは、一定の時間内に実行を完了させなければならないが、いくつかのステップが必要な場合に便利である。QIODevice 、およびそのサブクラスにあるwaitFor-型関数は、そのような必要性の良い例である。この場合、コードは次のようになる:

void executeSlowOperations(int timeout)
{
    QElapsedTimer timer;
    timer.start();
    slowOperation1();

    int remainingTime = timeout - timer.elapsed();
    if (remainingTime > 0)
        slowOperation2(remainingTime);
}

もうひとつのユースケースは、特定の操作を特定のタイムスライスで実行することである。この場合、QElapsedTimerはhasExpired()という便利な関数を提供しており、この関数を使用することで、特定のミリ秒数がすでに経過しているかどうかを判断することができます:

void executeOperationsForTime(int ms)
{
    QElapsedTimer timer;
    timer.start();

    while (!timer.hasExpired(ms))
        slowOperation1();
}

この場合、QDeadlineTimer を使用する方が便利な場合があります。 は、経過時間を追跡する代わりに、将来のタイムアウトに向かってカウントします。

リファレンスクロック

QElapsedTimer は、単調基準クロックをサポートしているすべてのプラットフォームで、そのプラットフォームの単調基準クロックを使用します (QElapsedTimer::isMonotonic() を参照)。これには、QElapsedTimerが、ユーザーが時刻を修正するなどの時刻調整の影響を受けないという利点があります。また、QTime とは異なり、QElapsedTimer は夏時間などのタイムゾーン設定の変更に影響されません。

一方、これは QElapsedTimer の値が、同じリファレンスを使用する他の値としか比較できないことを意味します。これは特に、参照からの時間が QElapsedTimer オブジェクト (QElapsedTimer::msecsSinceReference()) から抽出され、シリアル化された場合に当てはまります。これらの値をネットワーク上で交換したり、ディスクに保存したりするべきではありません。なぜなら、データを受信したコンピュータ・ノードが、そのデータを発信したコンピュータ・ノードと同じかどうか、あるいは、その後再起動したかどうかが分からないからです。

ただし、同じマシン上で動作している他のプロセスと値を交換することは可能です(そのプロセスも同じ基準クロックを使用している場合)。QElapsedTimerは常に同じクロックを使用するため、同じマシンの別のプロセスからの値と比較しても安全です。他のAPIによって生成された値と比較する場合は、使用されているクロックがQElapsedTimerと同じであることを確認する必要があります(QElapsedTimer::clockType ()を参照)。

QTimeQChronoTimerQDeadlineTimerも参照のこと

メンバ型ドキュメント

enum QElapsedTimer::ClockType

この列挙型には、QElapsedTimer が使用するさまざまなクロック・タイプが含まれる。

QElapsedTimer は特定のマシンで常に同じクロックタイプを使用するため、この値はプログラムのライフタイム中に変更されることはありません。これは、 を他の Qt 以外の実装で使用する際に、同じ基準クロックが使用されていることを保証するために提供されています。QElapsedTimer

定数説明
QElapsedTimer::SystemTime0人間が読めるシステム時間。この時計は単調ではない。
QElapsedTimer::MonotonicClock1通常Unixシステムで見られるシステムの単調時計。この時計は単調である。
QElapsedTimer::TickCounter2もう使われていない。
QElapsedTimer::MachAbsoluteTime3Machカーネルの絶対時間(macOSとiOS)。このクロックは単調である。
QElapsedTimer::PerformanceCounter4Windowsが提供するパフォーマンスカウンター。このクロックは単調である。
システム時間

システムタイムクロックは純粋に実時間であり、1970年1月1日0:00UTCからのミリ秒単位で表される。これは、CおよびPOSIXのtime 関数が返す値にミリ秒を足したものと同じである。この時計型は現在、単調時計をサポートしていないUnixシステムでのみ使用されています(下記参照)。

これはQElapsedTimer が使用できる唯一の非単調クロックである。

モノトニッククロック

これはシステムの単調クロックで、過去の任意の時点からのミリ秒単位で表される。このクロック型は、POSIXモノトニッククロック(_POSIX_MONOTONIC_CLOCK)をサポートするUnixシステムで使用されます。

MachAbsoluteTime

このクロックタイプは、macOSにあるようなMachカーネルが提示する絶対時間に基づいている。macOSやiOSもUnixシステムであり、Machの絶対時刻とは異なる値を持つPOSIXモノトニッククロックをサポートする可能性があるため、このクロックタイプはMonotonicClockとは別に提示される。

このクロックはモノトニックです。

パフォーマンスカウンター

このクロックは、Windows関数QueryPerformanceCounterQueryPerformanceFrequency を使用して、システムのパフォーマンスカウンターにアクセスします。

このクロックは単調である。

clockType() とisMonotonic()も参照

[alias] QElapsedTimer::Duration

std::chrono::nanoseconds の対義語。

[alias] QElapsedTimer::TimePoint

std::chrono::time_point<std::chrono::steady_clock, Duration> のシノニム。

メンバー関数ドキュメント

[constexpr noexcept] QElapsedTimer::QElapsedTimer()

無効な QElapsedTimer を構築します。タイマーは、開始されると有効になります。

isValid() およびstart()も参照してください

[static noexcept] QElapsedTimer::ClockType QElapsedTimer::clockType()

このQElapsedTimer 実装が使用するクロック・タイプを返します。

Qt 6.6 以降、QElapsedTimerstd::chrono::steady_clock を使用しているので、クロックタイプは常にMonotonicClock です。

isMonotonic()も参照してください

[noexcept, since 6.6] QElapsedTimer::Duration QElapsedTimer::durationElapsed() const

このQElapsedTimer が最後に起動されてからの時間をstd::chrono::nanoseconds で返す。

無効なQElapsedTimer でこの関数を呼び出すと、未定義の動作になります。

ナノ秒の分解能を提供しないプラットフォームでは、返される値は利用可能な最良の推定値になります。

この関数は Qt 6.6 で導入されました。

start(),restart(),hasExpired(),invalidate()も参照してください

[noexcept, since 6.6] QElapsedTimer::Duration QElapsedTimer::durationTo(const QElapsedTimer &other) const

このQElapsedTimerother の時間差をstd::chrono::nanoseconds として返す。other がこのオブジェクトより前に開始された場合、返される値は負になる。このオブジェクトより後に開始された場合、返される値は正となる。

このオブジェクトまたはother が無効化された場合、戻り値は未定義です。

この関数は Qt 6.6 で導入されました。

secsTo() およびelapsed()も参照してください

[noexcept] qint64 QElapsedTimer::elapsed() const

このQElapsedTimer が最後に起動してからのミリ秒数を返す。

無効なQElapsedTimer でこの関数を呼び出すと、未定義の動作になります。

start()、restart()、hasExpired()、isValid()、invalidate()も参照

[noexcept] bool QElapsedTimer::hasExpired(qint64 timeout) const

elapsed() が与えられたtimeout を超えていればtrue を返し、そうでなければfalse を返す。

負のtimeout は無限と解釈されるため、この場合はfalse が返される。それ以外の場合、これはelapsed() > timeout と等価である。durationElapsed() と継続時間タイムアウトを比較することで、継続時間についても同じことができる。

elapsed() およびQDeadlineTimerも参照のこと

[noexcept] void QElapsedTimer::invalidate()

このQElapsedTimer オブジェクトを無効としてマークする。

無効なオブジェクトはisValid() でチェックできる。無効なデータからの経過時間の計算は未定義であり、おそらく奇妙な結果となる。

isValid()、start()、restart()も参照

[static noexcept] bool QElapsedTimer::isMonotonic()

これがモノトニック・クロックであればtrue を返し、そうでなければ false を返す。どのクロックがモノトニックであるかについては、クロックの種類に関する情報を参照してください。

Qt 6.6 以降、QElapsedTimerstd::chrono::steady_clock を使用するため、この関数は常に true を返すようになりました。

clockType() およびQElapsedTimer::ClockTypeも参照してください

[noexcept] bool QElapsedTimer::isValid() const

タイマーが一度も開始されていないか、invalidate() の呼び出しによって無効化されている場合、false を返す。

invalidate()、start()、restart()も参照

[noexcept] qint64 QElapsedTimer::msecsSinceReference() const

このQElapsedTimer オブジェクトが最後に開始されてから、参照クロックが開始されるまでのミリ秒数を返す。

この数値は通常、QElapsedTimer::SystemTime クロック以外のすべてのクロックでは任意である。そのクロックタイプでは、この数値は1970年1月1日0:00UTCからのミリ秒数です(つまり、ミリ秒単位で表現されたUnix時間です)。

Linux、Windows、Appleプラットフォームでは、この値は通常、システム起動からの時間であるが、通常、システムがスリープ状態で過ごした時間は含まれない。

clockType() およびelapsed()も参照のこと

[noexcept] qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const

このQElapsedTimerother の間のミリ秒数を返す。other がこのオブジェクトより前に開始された場合、返される値は負になる。このオブジェクトより後に開始された場合、返される値は正になります。

このオブジェクトまたはother が無効化された場合、戻り値は未定義である。

secsTo() およびelapsed()も参照のこと

[noexcept] qint64 QElapsedTimer::nsecsElapsed() const

このQElapsedTimer が最後に起動してからのナノ秒数を返す。

無効なQElapsedTimer でこの関数を呼び出すと、未定義の動作になります。

ナノ秒の分解能を提供しないプラットフォームでは、返される値は利用可能な最良の推定値となる。

start()、restart()、hasExpired()、invalidate()も参照のこと

[noexcept] qint64 QElapsedTimer::restart()

タイマーを再スタートさせ、前回のスタートからの経過ミリ秒数を返す。この関数は、elapsed ()で経過時間を取得し、start ()でタイマーを再スタートさせるのと同じであるが、1回の操作でこれを行うため、クロック値を2回取得する必要がない。

無効なQElapsedTimer に対してこの関数を呼び出すと、未定義の動作になります。

次の例では、この関数を使用して、低速演算のパラメータ(例えば、反復回数)を較正し、この演算に少なくとも 250 ミリ秒かかるようにする方法を示します:

    QElapsedTimer timer;

    int count = 1;
    timer.start();
    do {
        count *= 2;
        slowOperation2(count);
    } while (timer.restart() < 250);

    return count;

start ()、invalidate ()、elapsed ()、isValid ()も参照

[noexcept] qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const

このQElapsedTimerother の間の秒数を返す。other がこのオブジェクトより前に開始された場合、返される値は負になる。このオブジェクトより後に開始された場合、返される値は正になります。

無効なQElapsedTimer でこの関数を呼び出すと、未定義の動作になります。

msecsTo() およびelapsed()も参照

[noexcept] void QElapsedTimer::start()

このタイマーを開始する。一度開始すると、elapsed() またはmsecsSinceReference() でタイマーの値をチェックできる。

通常、タイマーは次のような長時間の操作の直前に開始される:

    QElapsedTimertimer; timer.start();
    slowOperation1();

    qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";

また、タイマーをスタートさせると、再び有効になる。

restart ()、invalidate ()、elapsed)も参照の こと。

関連する非会員

[noexcept] bool operator!=(const QElapsedTimer &lhs, const QElapsedTimer &rhs)

lhsrhs に異なる時刻が含まれていればtrue を返し、そうでなければ false を返す。

[noexcept] bool operator<(const QElapsedTimer &lhs, const QElapsedTimer &rhs)

lhsrhs よりも前に開始されていればtrue を、そうでなければ false を返す。

2つのパラメータの一方が無効で、もう一方が無効でない場合、返される値は未定義である。しかし、2つの無効なタイマーは等しいので、この関数は偽を返す。

[noexcept] bool operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs)

lhsrhs に同じ時刻が含まれていればtrue を、そうでなければ false を返す。

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