class QElapsedTimer#

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

新增于版本 4.7。

摘要#

方法#

静态函数#

注意

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

详细描述#

警告

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

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

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

类的典型用法是确定耗时操作花费了多长时间。这样的用例的一个简单例子是为了调试目的,如下所示

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

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

经过的时间也可以用于在第一个操作完成后重新计算另一操作可用的时间。这适用于执行必须在一定时间期限内完成,但需要多个步骤的场合。例如,在QIODevice及其子类中,存在此方面的需求。在这种情况下,代码可能如下所示

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 QTimer QDeadlineTimer

class ClockType#

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

QElapsedTimer在特定机器上总是使用相同的时钟类型,因此此值在程序的生命周期中不会更改。它提供这样,以便QElapsedTimer可以使用其他非Qt实现,以保证使用相同的参考时钟。

常量

描述

QElapsedTimer.SystemTime

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

QElapsedTimer.MonotonicClock

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

QElapsedTimer.TickCounter

不再使用。

QElapsedTimer.MachAbsoluteTime

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

QElapsedTimer.PerformanceCounter

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

SystemTime#

系统时间时钟仅是真实时间,自1970年1月1日0:00 UTC起以毫秒为单位。它与C和POSIX time函数返回的值相等,并添加了毫秒数。此时钟类型目前在不支持单调时钟的Unix系统上使用(见下文)。

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

MonotonicClock#

这是系统的单调时钟,以毫秒为单位表示自过去某个任意点以来的时间。此时钟类型用于支持POSIX单调时钟的Unix系统(_POSIX_MONOTONIC_CLOCK)。

MachAbsoluteTime#

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

此时钟是单调的。

PerformanceCounter#

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

此时钟是单调的。

另请参阅

clockType() isMonotonic()

新增于版本 4.7。

__init__()#

构造一个无效的QElapsedTimer . 一旦启动计时器,它就变得有效。

另请参阅

isValid() start()

静态 clockType()#
返回类型 :

ClockType

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

从 Qt 6.6 开始,QElapsedTimer 使用 std::chrono::steady_clock,因此时钟类型始终是 MonotonicClock

另请参阅

isMonotonic()

elapsed()#
返回类型 :

int

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

在无效的 QElapsedTimer 上调用此函数将产生未定义的行为。

hasExpired(timeout)#
参数 :

timeout – int

返回类型 :

bool

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

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

另请参阅

elapsed() QDeadlineTimer

invalidate()#

将此 QElapsedTimer 对象标记为无效。

可以通过 isValid() 检查一个无效的对象。自从出现无效数据以来,计时器的计算是未定义的,并可能产生奇怪的结果。

另请参阅

isValid() start() restart()

static isMonotonic()#
返回类型 :

bool

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

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

另请参阅

clockType() ClockType

isValid()#
返回类型 :

bool

如果计时器从未启动或通过调用 invalidate() 被使无效,则返回 false

msecsSinceReference()#
返回类型 :

int

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

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

在 Linux、Windows 和 Apple 平台上,此值通常是自系统启动以来的时间,尽管通常不包括系统处于休眠状态的时间。

另请参阅

clockType() elapsed()

msecsTo(other)#
参数 :

otherQElapsedTimer

返回类型 :

int

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

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

另请参阅

secsTo() elapsed()

nsecsElapsed()#
返回类型 :

int

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

在无效的 QElapsedTimer 上调用此函数将产生未定义的行为。

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

__ne__(rhs)#
参数 :

rhsQElapsedTimer

返回类型 :

bool

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

__eq__(rhs)#
参数 :

rhsQElapsedTimer

返回类型 :

bool

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

restart()#
返回类型 :

int

警告

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

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

在无效的 QElapsedTimer 上调用此函数将产生未定义的行为。

以下示例说明如何使用此函数校准慢速操作(例如迭代计数)的参数,以便该操作至少需要250毫秒

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

otherQElapsedTimer

返回类型 :

int

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

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

另请参阅

msecsTo() elapsed()

start()#

警告

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

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

通常,在长时间操作之前启动定时器,例如

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

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