このページでは

QElapsedTimer Class

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

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

注:このクラスのすべての関数は再入可能である。

QElapsedTimer の比較

カテゴリ比較可能な型
strongQElapsedTimer

パブリック型

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オブジェクトを人間が読み取れる形式の時間に変換することはできません。

このクラスの典型的な使用例は、処理に時間がかかった操作にどれだけの時間が費やされたかを特定することです。その最も単純な例は、次の例のようにデバッグを目的とした場合です:

    QElapsedTimer timer;
    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);
}

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

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

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

この場合、経過時間を追跡するのではなく、将来のタイムアウトまでの時間をカウントする `QDeadlineTimer ` を使用する方が便利な場合が多いです。

基準クロック

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

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

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

QTime 、QChronoTimer 、およびQDeadlineTimerも参照してください 。

メンバ型のドキュメント

enum QElapsedTimer::ClockType

この列挙型には、QElapsedTimer が使用する可能性のあるさまざまなクロックタイプが含まれています。

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

定数値説明
QElapsedTimer::SystemTime0人間が読み取れる形式のシステム時刻。このクロックは単調ではありません。
QElapsedTimer::MonotonicClock1システムの単調なクロック。通常、Unix システムに見られます。このクロックは単調です。
QElapsedTimer::TickCounter2現在は使用されていません。
QElapsedTimer::MachAbsoluteTime3Machカーネルの絶対時間(macOSおよびiOS)。このクロックは単調です。
QElapsedTimer::PerformanceCounter4Windowsが提供するパフォーマンスカウンター。このクロックは単調です。
SystemTime

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

これは、QElapsedTimer が使用し得る唯一の非単調クロックです。

MonotonicClock

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

MachAbsoluteTime

このクロックタイプは、macOSなどで見られるような、Machカーネルによって提供される絶対時刻に基づいています。macOSやiOSもUnix系システムであり、Machの絶対時刻とは異なる値を持つPOSIX単調クロックをサポートしている可能性があるため、このクロックタイプはMonotonicClockとは別に扱われます。

このクロックは単調です。

PerformanceCounter

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

このクロックは単調です。

clockType() およびisMonotonic()も参照してください 。

[alias] QElapsedTimer::Duration

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

[alias] QElapsedTimer::TimePoint

std::chrono::time_point<std::chrono::steady_clock, Duration> の同義語。

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

[constexpr noexcept default] QElapsedTimer::QElapsedTimer()

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

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

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

このQElapsedTimer 実装で使用されているクロックタイプを返します。

Qt 6.6以降、QElapsedTimer はstd::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

このQElapsedTimer とother の間の時間差を、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 以降、QElapsedTimer はstd::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:00 UTCからの経過ミリ秒数となります(つまり、ミリ秒単位で表されたUnixタイムです)。

Linux、Windows、およびAppleプラットフォームでは、この値は通常、システムの起動からの経過時間ですが、システムがスリープ状態にあった時間は通常含まれません。

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

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

このQElapsedTimer とother との間の経過時間をミリ秒単位で返します。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

このQElapsedTimer とother との間の秒数を返します。other がこのオブジェクトよりも前に起動された場合、戻り値は負の数になります。それより後に起動された場合、戻り値は正の数になります。

無効な `QElapsedTimer ` に対して、またはそれを引数としてこの関数を呼び出すと、未定義の挙動となります。

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

[noexcept] void QElapsedTimer::start()

このタイマーを開始します。開始後は、elapsed() またはmsecsSinceReference() を使用して、タイマーの値を確認できます。

通常、タイマーは次のような長時間かかる処理の直前に開始されます。

    QElapsedTimer timer;
    timer.start();

    slowOperation1();

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

また、タイマーを起動すると、再び有効になります。

restart()、invalidate()、およびelapsed()も参照してください 。

関連する非メンバー

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

lhs とrhs に異なる時刻が含まれている場合は `true ` を返し、そうでない場合は `false` を返します。

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

lhs がrhs よりも前に開始されていた場合はtrue を返し、そうでない場合はfalseを返します。

2つのパラメータのうち、一方が無効で他方が有効な場合、戻り値は未定義となります。ただし、2つの無効なタイマーは等価であるため、この関数はfalseを返します。

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

lhs とrhs に同じ時刻が含まれている場合は `true ` を返し、そうでない場合は `false` を返します。

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