- class QElapsedTimer#
类
QElapsedTimer
提供了一种快速计算已过时间的方法。 更多...新增于版本 4.7。
摘要#
方法#
def
__init__()
def
elapsed()
def
hasExpired()
def
invalidate()
def
isValid()
def
msecsTo()
def
nsecsElapsed()
定义
__ne__()
定义
__eq__()
定义
restart()
定义
secsTo()
定义
start()
静态函数#
定义
clockType()
注意
本文档可能包含自动从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()
)。另请参阅
- 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函数
QueryPerformanceCounter
和QueryPerformanceFrequency
来访问系统的性能计数器。此时钟是单调的。
另请参阅
新增于版本 4.7。
- __init__()#
构造一个无效的
QElapsedTimer
. 一旦启动计时器,它就变得有效。返回该
QElapsedTimer
实现使用的时钟类型。从 Qt 6.6 开始,
QElapsedTimer
使用std::chrono::steady_clock
,因此时钟类型始终是MonotonicClock
。另请参阅
- elapsed()#
- 返回类型 :
int
返回自
QElapsedTimer
上次启动以来的毫秒数。在无效的
QElapsedTimer
上调用此函数将产生未定义的行为。- hasExpired(timeout)#
- 参数 :
timeout – int
- 返回类型 :
bool
如果
elapsed()
大于给定的timeout
,则返回true
,否则返回false
。负数
timeout
被解释为无限,因此在这种情况下返回false
。否则,这等价于elapsed() > timeout
。您可以通过比较durationElapsed()
和超时持续时间来做同样的事情。另请参阅
- invalidate()#
将此
QElapsedTimer
对象标记为无效。可以通过
isValid()
检查一个无效的对象。自从出现无效数据以来,计时器的计算是未定义的,并可能产生奇怪的结果。- static isMonotonic()#
- 返回类型 :
bool
如果这是一个单调时钟,则返回
true
,否则为false
。有关不同时钟类型的信息,了解哪些是单调的。自 Qt 6.6 以来,
QElapsedTimer
使用std::chrono::steady_clock
,因此此函数始终返回 true。另请参阅
- isValid()#
- 返回类型 :
bool
如果计时器从未启动或通过调用
invalidate()
被使无效,则返回false
。另请参阅
- msecsSinceReference()#
- 返回类型 :
int
返回此
QElapsedTimer
对象上次启动和其参考时钟的开始之间的毫秒数。除了
SystemTime
时钟外,此数字对于所有时钟通常是任意的。对于这种时钟类型,此数字是从 1970 年 1 月 1 日 0:00 UTC 以来经过的毫秒数(即它是用毫秒表示的 Unix 时间)。在 Linux、Windows 和 Apple 平台上,此值通常是自系统启动以来的时间,尽管通常不包括系统处于休眠状态的时间。
另请参阅
- msecsTo(other)#
- 参数 :
other –
QElapsedTimer
- 返回类型 :
int
返回此
QElapsedTimer
与other
之间的毫秒数。如果other
在此对象之前启动,则返回的值将为负数。如果它在之后启动,则返回的值为正数。如果此对象或
other
被无效化,则返回值未定义。- nsecsElapsed()#
- 返回类型 :
int
返回自此
QElapsedTimer
上次启动以来的纳秒数。在无效的
QElapsedTimer
上调用此函数将产生未定义的行为。在不提供纳秒分辨率的平台上,返回的值将是最佳估计值。
- __ne__(rhs)#
- 参数 :
rhs –
QElapsedTimer
- 返回类型 :
bool
如果
lhs
和rhs
包含不同的时间,则返回true
,否则返回false
。- __eq__(rhs)#
- 参数 :
rhs –
QElapsedTimer
- 返回类型 :
bool
如果
lhs
和rhs
包含相同的时间,则返回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)#
- 参数 :
other –
QElapsedTimer
- 返回类型 :
int
返回此
QElapsedTimer
和other
之间的秒数。如果other
在此对象启动之前启动,则返回的值将为负。如果它在此对象之后启动,则返回的值将为正。在此无效的
QElapsedTimer
上调用此函数将导致未定义的行为。- start()#
警告
本节包含自动从C++翻译到Python的代码片段,可能包含错误。
启动此计时器。一旦启动,就可以使用
elapsed()
或msecsSinceReference()
检查计时器的值。通常,在长时间操作之前启动定时器,例如
timer = QElapsedTimer() timer.start() slowOperation1() print("The slow operation took", timer.elapsed(), "milliseconds")
此外,启动计时器使其再次有效。