PySide6.QtCore.QElapsedTimer

class QElapsedTimer

QElapsedTimer 类提供了一种快速计算经过时间的方法。更多

在版本4.7中添加。

概要

方法

静态函数

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

QElapsedTimer 类通常用于快速计算两个事件之间经过了多少时间。它的API与QTime 类似,因此使用该类的代码可以快速移植到新类中。

然而,与QTime不同,QElapsedTimer尽可能尝试使用单调时钟。这意味着无法将QElapsedTimer对象转换为人类可读的时间。

该类的典型用例是确定在慢操作中花费了多少时间。这种情况的最简单示例是用于调试目的,如下例所示:

timer = QElapsedTimer()
timer.start()
slowOperation1()
print("The slow operation took", timer.elapsed(), "milliseconds")

在这个例子中,计时器通过调用start()启动,经过的时间由elapsed()函数计算。

经过的时间也可以用于在第一个操作完成后重新计算可用于另一个操作的时间。这在执行必须在特定时间段内完成但需要多个步骤时非常有用。QIODevice及其子类中的waitFor类型函数是这种需求的好例子。在这种情况下,代码可能如下所示:

def executeSlowOperations(timeout):

    timer = QElapsedTimer()
    timer.start()
    slowOperation1()
    remainingTime = timeout - timer.elapsed()
    if remainingTime > 0:
        slowOperation2(remainingTime)

另一个用例是为特定的时间段执行某个操作。为此,QElapsedTimer 提供了 hasExpired() 便利函数,可以用来确定是否已经过了特定的毫秒数:

def executeOperationsForTime(ms):

    timer = QElapsedTimer()
    timer.start()
    while not timer.hasExpired(ms):
        slowOperation1()

在这种情况下,使用QDeadlineTimer通常更为方便,它计算未来的超时时间,而不是跟踪已用时间。

参考时钟

QElapsedTimer 将在所有支持它的平台上使用平台的单调参考时钟(参见 isMonotonic())。这有一个额外的好处,即 QElapsedTimer 不受时间调整的影响,例如用户校正时间。此外,与 QTime 不同,QElapsedTimer 不受时区设置变化的影响,例如夏令时期间。

另一方面,这意味着QElapsedTimer的值只能与使用相同参考的其他值进行比较。如果从QElapsedTimer对象中提取自参考以来的时间(msecsSinceReference())并进行序列化,这一点尤其重要。这些值绝不应该通过网络交换或保存到磁盘上,因为无法确定接收数据的计算机节点是否与发起数据的节点相同,或者它是否已经重新启动。

然而,如果其他进程也在同一台机器上运行并使用相同的参考时钟,则可以与其交换值。QElapsedTimer 将始终使用相同的时钟,因此与来自同一台机器上另一个进程的值进行比较是安全的。如果与其他API生成的值进行比较,您应检查所使用的时钟是否与QElapsedTimer 相同(参见clockType())。

另请参阅

QTime QChronoTimer QDeadlineTimer

class ClockType

此枚举包含QElapsedTimer可能使用的不同时钟类型。

QElapsedTimer 在特定机器上将始终使用相同的时钟类型,因此该值在程序的生命周期内不会改变。提供此值是为了确保 QElapsedTimer 可以与其他非 Qt 实现一起使用,以保证使用相同的参考时钟。

常量

描述

QElapsedTimer.SystemTime

人类可读的系统时间。这个时钟不是单调的。

QElapsedTimer.MonotonicClock

系统的单调时钟,通常在Unix系统中找到。这个时钟是单调的。

QElapsedTimer.TickCounter

不再使用。

QElapsedTimer.MachAbsoluteTime

Mach内核的绝对时间(macOS和iOS)。这个时钟是单调的。

QElapsedTimer.PerformanceCounter

Windows提供的性能计数器。这个时钟是单调的。

系统时间

系统时间时钟纯粹是实时时间,以自1970年1月1日UTC时间0:00以来的毫秒数表示。它等同于C和POSIX time 函数返回的值,并添加了毫秒。这种时钟类型目前仅用于不支持单调时钟的Unix系统(见下文)。

这是QElapsedTimer可能使用的唯一非单调时钟。

单调时钟

这是系统的单调时钟,以毫秒表示,自过去的任意点开始计时。这种时钟类型用于支持POSIX单调时钟的Unix系统(_POSIX_MONOTONIC_CLOCK)。

MachAbsoluteTime

这种时钟类型基于Mach内核提供的绝对时间,例如在macOS上找到的那种。这种时钟类型与MonotonicClock分开呈现,因为macOS和iOS也是Unix系统,可能支持与Mach绝对时间值不同的POSIX单调时钟。

这个时钟是单调的。

性能计数器

这个时钟使用Windows函数QueryPerformanceCounterQueryPerformanceFrequency来访问系统的性能计数器。

这个时钟是单调的。

另请参阅

clockType() isMonotonic()

在版本4.7中添加。

__init__()

构造一个无效的QElapsedTimer。计时器一旦启动就会变为有效。

另请参阅

isValid() start()

static clockType()
Return type:

ClockType

返回此QElapsedTimer实现使用的时钟类型。

自 Qt 6.6 起,QElapsedTimer 使用 std::chrono::steady_clock,因此时钟类型始终为 MonotonicClock

另请参阅

isMonotonic()

elapsed()
Return type:

整数

返回自上次启动此QElapsedTimer以来的毫秒数。

在无效的QElapsedTimer上调用此函数会导致未定义的行为。

hasExpired(timeout)
Parameters:

timeout – int

Return type:

布尔

如果elapsed()超过给定的timeout,则返回true,否则返回false

负的timeout被解释为无限,因此在这种情况下返回false。否则,这等同于elapsed() > timeout。你可以通过比较durationElapsed()和持续时间超时来做同样的事情。

另请参阅

elapsed() QDeadlineTimer

invalidate()

将此QElapsedTimer对象标记为无效。

可以使用isValid()检查无效对象。自无效数据以来的计时器经过时间的计算是未定义的,可能会产生奇怪的结果。

另请参阅

isValid() start() restart()

static isMonotonic()
Return type:

布尔

如果这是一个单调时钟,则返回true,否则返回false。请参阅有关不同时钟类型的信息,以了解哪些是单调的。

自 Qt 6.6 起,QElapsedTimer 使用 std::chrono::steady_clock,因此此函数现在始终返回 true。

另请参阅

clockType() ClockType

isValid()
Return type:

布尔

如果计时器从未启动或被调用invalidate()而失效,则返回false

msecsSinceReference()
Return type:

整数

返回自上次启动此QElapsedTimer对象与其参考时钟启动之间的毫秒数。

这个数字通常对于所有时钟都是任意的,除了SystemTime时钟。对于这种时钟类型,这个数字是自1970年1月1日0:00 UTC以来的毫秒数(即,它是用毫秒表示的Unix时间)。

在Linux、Windows和Apple平台上,这个值通常是系统启动以来的时间,尽管它通常不包括系统在睡眠状态中花费的时间。

另请参阅

clockType() elapsed()

msecsTo(other)
Parameters:

其他QElapsedTimer

Return type:

整数

返回此QElapsedTimerother之间的毫秒数。如果other在此对象之前启动,则返回的值为负数。如果在此对象之后启动,则返回的值为正数。

如果此对象或other无效,则返回值为未定义。

另请参阅

secsTo() elapsed()

nsecsElapsed()
Return type:

整数

返回自上次启动此QElapsedTimer以来的纳秒数。

在无效的QElapsedTimer上调用此函数会导致未定义的行为。

在不提供纳秒分辨率的平台上,返回的值将是可用的最佳估计。

__ne__(rhs)
Parameters:

rhsQElapsedTimer

Return type:

布尔

如果 lhsrhs 包含不同的时间,则返回 true,否则返回 false。

__le__(rhs)
Parameters:

rhsQElapsedTimer

Return type:

布尔

__eq__(rhs)
Parameters:

rhsQElapsedTimer

Return type:

布尔

如果 lhsrhs 包含相同的时间,则返回 true,否则返回 false。

__gt__(rhs)
Parameters:

rhsQElapsedTimer

Return type:

布尔

__ge__(rhs)
Parameters:

rhsQElapsedTimer

Return type:

布尔

restart()
Return type:

整数

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

重新启动计时器并返回自上次启动以来经过的毫秒数。此函数等效于使用elapsed()获取经过的时间,然后使用start()再次启动计时器,但它在一个单一的操作中完成,避免了需要获取两次时钟值的需求。

在无效的QElapsedTimer上调用此函数会导致未定义的行为。

以下示例说明了如何使用此函数来校准一个参数以进行慢速操作(例如,迭代次数),以便此操作至少需要250毫秒:

timer = QElapsedTimer()
count = 1
timer.start()
do {
     = 2
    slowOperation2(count)
} while (timer.restart() < 250)
return count
secsTo(other)
Parameters:

其他QElapsedTimer

Return type:

整数

返回此QElapsedTimerother之间的秒数。如果other在此对象之前启动,则返回的值将为负数。如果它在此对象之后启动,则返回的值将为正数。

在无效的QElapsedTimer上或使用无效的QElapsedTimer调用此函数会导致未定义的行为。

另请参阅

msecsTo() elapsed()

start()

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

启动此计时器。一旦启动,可以使用elapsed()msecsSinceReference()检查计时器值。

通常,计时器会在一个耗时的操作开始前启动,例如:

timer = QElapsedTimer()
timer.start()
slowOperation1()
print("The slow operation took", timer.elapsed(), "milliseconds")

此外,启动计时器会使其再次有效。