我正在编写一个 Cocoa OS X (Leopard 10.5+) 最终用户程序,它使用时间戳来计算屏幕上显示的时间的统计信息。当程序使用重复的 NSTimer 运行时,时间会定期计算。 [NSDate date]
用于捕获时间戳Start和Finish。以秒为单位计算两个日期之间的差异是微不足道的。
如果最终用户或 ntp 更改系统时钟,则会出现问题。 [NSDate date]
依赖于系统时钟,所以如果它被改变,Finish变量将相对于Start倾斜,严重地扰乱了时间计算。我的问题:
1. 如何准确计算Start和Finish之间的时间,以秒为单位,即使中途更改了系统时钟?
我在想我需要一个不变的参考时间点,这样我就可以计算从那时起已经过去了多少秒。例如,系统正常运行时间。10.6 具有- (NSTimeInterval)systemUptime
, 部分NSProcessInfo
, 提供系统正常运行时间。但是,这不起作用,因为我的应用程序必须在 10.5 中运行。
我尝试使用 NSTimer 创建一个计时器,但这并不准确。NSTimer 有几种不同的运行模式,一次只能运行一种。NSTimer(默认)被置于默认运行模式。如果用户开始操作 UI 足够长的时间,这将进入NSEventTrackingRunLoopMode并跳过默认运行模式,这可能导致 NSTimer 触发被跳过,使其成为一种不准确的秒数计数方式。
我还考虑过创建一个单独的线程 (NSRunLoop) 来运行 NSTimer 秒计数器,使其远离 UI 交互。但我对多线程非常陌生,如果可能的话,我想远离它。此外,我不确定如果 CPU 被另一个应用程序(Photoshop 渲染大图像等)挂起,这是否能正常工作,导致我的 NSRunLoop 被搁置足够长的时间以搞砸它NS定时器。
我很感激任何帮助。:)