我正在编写一个 Cocoa OS X (Leopard 10.5+) 最终用户程序,该程序使用时间戳来计算屏幕上显示内容的统计时间。当程序运行时,使用重复的 NSTimer 定期计算时间。[NSDate date]
用于捕获时间戳,Start and Finish。以秒为单位计算两个日期之间的差异是微不足道的。
如果最终用户或 ntp 更改系统时钟,就会出现问题。[NSDate date]
依赖于系统时钟,所以如果它改变了,Finish变量将相对于Start,严重扰乱时间计算。我的问题:
1.如何准确计算之间的时间Start and Finish,以秒为单位,即使系统时钟中途更改?
我想我需要一个不变的时间参考点,这样我就可以计算从那时起已经过去了多少秒。例如,系统正常运行时间。 10.6有- (NSTimeInterval)systemUptime
, 部分NSProcessInfo
,提供系统正常运行时间。但是,这不起作用,因为我的应用程序必须在 10.5 中运行。
我尝试过使用 NSTimer 创建时间计数器,但这并不准确。 NSTimer 有几种不同的运行模式,并且一次只能运行一种。 NSTimer(默认情况下)被放入default运行模式。如果用户开始操作 UI 的时间足够长,就会进入NSEventTrackingRunLoopMode并跳过default运行模式,这可能导致 NSTimer 触发被跳过,使其成为一种不准确的秒数计数方式。
我还考虑过创建一个单独的线程(NSRunLoop)来运行 NSTimer 秒计数器,使其远离 UI 交互。但我对多线程非常陌生,如果可能的话我想远离它。另外,我不确定如果 CPU 被另一个应用程序(Photoshop 渲染大图像等)固定,这是否能正常工作,导致我的 NSRunLoop 被搁置足够长的时间以弄乱它的NSTimer。
我很感激任何帮助。 :)
根据驱动此代码的原因,您有 2 个选择:
- 对于绝对精度,请使用mach_absolute_time()。它将准确给出您调用该函数的点之间的时间间隔。
- 但在 GUI 应用程序中,这实际上通常是不可取的。相反,您想要的是之间的时差events开始和结束你的持续时间。如果是这样,比较一下
[[NSApp currentEvent] timestamp]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)