QElapsedTimer Class
QElapsedTimer クラスは、経過時間を高速に計算する方法を提供します。詳細...
Header: | #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つのイベント間の経過時間を素早く計算するために使用されます。QElapsedTimer クラスの API はQTime の API と似ているので、そちらを使用していたコードを新しいクラスに素早く移植することができます。
しかし、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); }
もうひとつのユースケースは、特定の操作を特定のタイムスライスで実行することである。この場合、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 ()を参照)。
QTime 、QChronoTimer 、QDeadlineTimerも参照のこと 。
メンバ・タイプのドキュメント
enum QElapsedTimer::ClockType
この列挙型には、QElapsedTimer が使用できるさまざまなクロック・タイプが含まれています。
QElapsedTimer 特定のマシンでは常に同じクロック・タイプを使用するため、この値はプログラムの有効期間中に変更されることはありません。これは、 が他の非 Qt 実装と一緒に使用できるように提供され、同じ参照クロックが使用されていることを保証します。QElapsedTimer
定数 | 値 | 説明 |
---|---|---|
QElapsedTimer::SystemTime | 0 | 人間が読めるシステム時間。この時計は単調ではない。 |
QElapsedTimer::MonotonicClock | 1 | 通常Unixシステムで見られるシステムの単調時計。この時計は単調である。 |
QElapsedTimer::TickCounter | 2 | もう使われていない。 |
QElapsedTimer::MachAbsoluteTime | 3 | Machカーネルの絶対時刻(macOSとiOS)。このクロックは単調である。 |
QElapsedTimer::PerformanceCounter | 4 | Windowsが提供するパフォーマンスカウンター。このクロックは単調である。 |
システム時間
システムタイムクロックは純粋に実時間であり、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関数QueryPerformanceCounter
とQueryPerformanceFrequency
を使用して、システムのパフォーマンスカウンターにアクセスします。
このクロックは単調である。
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 を構築します。タイマーは、開始されると有効になります。
[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:00UTCからのミリ秒数です(つまり、ミリ秒単位で表現されたUnix時間です)。
Linux、Windows、Appleプラットフォームでは、この値は通常、システム起動からの時間であるが、通常、システムがスリープ状態で過ごした時間は含まれない。
[noexcept]
qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
このQElapsedTimer とother の間のミリ秒数を返します。other がこのオブジェクトより前に起動された場合、返される値は負になります。このオブジェクトより後に開始された場合、返される値は正になります。
このオブジェクトまたはother が無効化された場合、戻り値は未定義である。
[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() で確認できる。
通常、タイマーの開始は、.time()などの長時間の操作の直前に行われます:
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つの無効なタイマーは等しいので、この関数は偽を返す。
[noexcept]
bool operator==(const QElapsedTimer &lhs, const QElapsedTimer &rhs)
lhs とrhs が同じ時刻を含む場合はtrue
を返し、そうでない場合は false を返します。
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。