Как реализовать долгосрочную синхронизацию высокого разрешения на окнах с использованием C ++? - PullRequest
5 голосов
/ 28 сентября 2011

Мне нужно получать точные метки времени каждые пару мс (20, 30, 40 мс) в течение длительного периода времени (пару часов).Функция, в которой берется метка времени, вызывается как обратный вызов сторонней библиотекой.

Используя GetSystemTime(), можно получить правильную системную метку времени, но только с точностью до миллисекунд, что для меня недостаточно точно.Использование QueryPerformanceTimer() дает более точные временные метки, но не синхронизируется с системной временной меткой в ​​течение длительного периода времени (см. http://msdn.microsoft.com/en-us/magazine/cc163996.aspx).

. Решение, представленное на указанном выше сайте, каким-то образом работает только на старых компьютерах, зависаетпри синхронизации, когда я пытаюсь использовать его с более новыми компьютерами.

Мне кажется, что boost также работает только с точностью до миллисекунд. Если возможно, я бы хотел избежать использования внешних библиотек, но если нет другихВыбор Я пойду с этим.

Есть предложения?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 28 сентября 2011

Удалена статья из CodeProject, похоже, это копия: DateTimePrecise C # Class Идея состоит в том, чтобы использовать QueryPerformanceCounter API для точных небольших приращений и периодически корректировать его, чтобы сохранить долгосрочную точность. Это дает микросекундную точность («примерно», потому что она все еще не совсем точна, но все еще вполне применима).

См. Также: Отметки времени с микросекундным разрешением в Windows

0 голосов
/ 12 июля 2012

В Windows такого QueryPerformanceTimer () нет. Ресурс называется QueryPerformanceCounter(). Это обеспечивает подсчет значений счетчика на более высокой частоте. Частота его приращения может быть получена путем вызова на QueryPerformanceFrequency(). Поскольку эта частота обычно находится в диапазоне МГц, можно наблюдать микросекундное разрешение.

Есть несколько реализаций вокруг , т.е. этот поток или Проект отметки времени Windows

0 голосов
/ 28 сентября 2011

Вам будет сложно найти что-нибудь лучше, чем QueryPerformanceTimer () в Windows.

На современном оборудовании он использует HPET в качестве источника, который заменяет контроллер прерываний RTC.Я ожидаю, что QueryPerformanceTimer () и системные часы будут синхронными.

0 голосов
/ 28 сентября 2011

Какой язык вы используете?

  • В Java (1.5 или выше) я бы предложил 'System.nanoTime ()', который не требует импорта.

Помните, что в Windows гранулярность временного интервала составляет 1000 мс / 64 = 15,625 мс.

  • Это повлияет на межпроцессное взаимодействие, особенно на однопроцессорных компьютерах или машинах, на которых одновременно выполняется несколько процессов с интенсивным использованием ЦП *.

  • На самом деле, я только что получил DOS 6.22 и Windows for Workgroups 3.11 / 3.15 через eBay, так что я могу сделать снимок экрана с исходной конфигурацией временного интервала для однопроцессорных машин Windows того времени, когда я начал в нее входить. (Хотя это может быть не видно в версиях выше 3.0).

...