MacOS上最准确的计时器

时间:2018-11-20 16:35:26

标签: swift macos grand-central-dispatch nstimer

我有一个应用程序,该应用程序从连接到Mac的USB传感器读取环境数据。用户能够配置应用对数据采样的频率以及应用对这些采样进行平均的频率,并将平均值记录到文件中。

我第一次使用NSTimer,但是那是非常不准确的,尤其是当显示器进入睡眠状态时。我现在正在使用DispatchSourceTimer,但是它仍然每21-23秒丢失1毫秒,大约每6小时大约1秒。理想情况下,我希望每天少于1秒。

有什么想法可以使计时器更精确些吗?

func setupTimer() -> DispatchSourceTimer {
    let timer = DispatchSource.makeTimerSource(flags: .strict, queue: nil)
    let repeatInterval = DispatchTimeInterval.seconds(samplingInterval)
    let deadline : DispatchTime = .now() + repeatInterval
    timer.schedule(deadline: deadline, repeating: repeatInterval, leeway: .nanoseconds(0))
    timer.setEventHandler(handler: self.collectPlotAndLogDatapoint)
    return timer
}

func collectPlotAndLogDatapoint() {
    samplingIntervalCount += 1
    let dataPoint : Float = softwareLoggingDelegate?.getCurrentCalibratedOutput() ?? 0
    accumulatedTotal += dataPoint
    if samplingIntervalCount == loggingInterval / samplingInterval{
        let average = self.accumulatedTotal/Float(self.samplingIntervalCount)
        DispatchQueue.global().async {
            self.logDataPoint(data: average)
            self.chartControls.addPointsToLineChart([Double(average)], Date().timeIntervalSince1970)
            self.samplingIntervalCount = 0
            self.accumulatedTotal = 0
        }
    }
}

1 个答案:

答案 0 :(得分:2)

对此的答案(以及回应的评论)似乎表明,在Swift中很难获得亚毫秒级的精度:

How do I achieve very accurate timing in Swift?

对于高精度计时器,Apple显然有其应做的事情:https://developer.apple.com/library/archive/technotes/tn2169/_index.html

一天

〜3-4秒对于一个环境传感器来说是非常准确的,我想这只会对那些想要间隔<< 1秒进行采样的用户证明一个问题(甚至是值得注意的)。