Самый точный таймер на MacOS - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть приложение, которое считывает данные об окружающей среде с USB-датчика, подключенного к Mac.Пользователи могут настроить частоту выборки данных приложением, а также частоту их усреднения и записи среднего значения в файл.

Сначала я использовал NSTimer, но это было крайне неточно, особенно когда дисплей перешел в спящий режим.Сейчас я использую DispatchSourceTimer, но он по-прежнему теряет 1 миллисекунду каждые 21-23 секунды, что составляет около 1 секунды каждые 6 часов или около того.В идеале я бы хотел, чтобы это было менее 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 голосов
/ 20 ноября 2018

Ответы (и комментарии в ответ) на это, по-видимому, указывают на то, что в Swift трудно получить точность до миллисекунды:

Как мне добиться очень точной синхронизации в Swift?

У Apple, по-видимому, есть свои собственные плюсы и минусы для высокоточных таймеров: https://developer.apple.com/library/archive/technotes/tn2169/_index.html

~ 3-4 секунды в день довольно точно для датчика окружающей среды, я мог бы представить этотолько докажет проблему (или даже заметную) для тех пользователей, которые хотят брать образцы с интервалом << 1 секунда. </p>

...