Задача: вовремя среагировать на изменение системного времени, во время синхронизации его с NTP сервером.
Кроссплатформенно.
Как повесить обработчик на NTP?
Модератор: Модераторы
Проще самому получать время клиентом NTP и если нужно делать синхронизацию, посылать сообщения, SMS, Telegram-ить, выключать свет и запускать двигатели звездолета..
все это будет кроссплаторменно.
все это будет кроссплаторменно.
Мне нужно отследить момент, когда ОС сама выполнит синхронизацию времени, или пользователь вручную это сделает, или какое стороннее приложение это сделает. Мне как раз ненужно, чтобы время НЕ менялось. И поэтому нужно успеть среагировать на изменение системного времени.
Параллельный вопрос:
Как реализовать собственный "стабильный" таймер, который не будет зависеть в течение одних-двух суток от любых изменений системного времени, и будет четко выдавать собственное время?
Запустил пользователь приложение. Включился собственный таймер. Синхронизировался с системным временем. Пользователь, стороннее ПО или ОС изменили системное время, а собственный таймер продолжает выдавать нужное время, как-будто время никто не менял. Постоянно синхронизировать его по NTP нельзя. Так как - это будет тоже самое, что и довериться ОС. Любое изменение времени между стартом приложения и текущим моментом - вызовет ошибку в расчетах. При этом постепенное отставание или опережение (в зависимости от железа ПК) реального времени - не вызовет ошибку в расчетах. Точность определения текущего времени = 1 миллисек.
Возможно решением будет использование GetTickCount. Но не уверен, что в течение 2 суток, он будет стабильно выдавать разницу между стартом приложения и текущим моментом...
Параллельный вопрос:
Как реализовать собственный "стабильный" таймер, который не будет зависеть в течение одних-двух суток от любых изменений системного времени, и будет четко выдавать собственное время?
Запустил пользователь приложение. Включился собственный таймер. Синхронизировался с системным временем. Пользователь, стороннее ПО или ОС изменили системное время, а собственный таймер продолжает выдавать нужное время, как-будто время никто не менял. Постоянно синхронизировать его по NTP нельзя. Так как - это будет тоже самое, что и довериться ОС. Любое изменение времени между стартом приложения и текущим моментом - вызовет ошибку в расчетах. При этом постепенное отставание или опережение (в зависимости от железа ПК) реального времени - не вызовет ошибку в расчетах. Точность определения текущего времени = 1 миллисек.
Возможно решением будет использование GetTickCount. Но не уверен, что в течение 2 суток, он будет стабильно выдавать разницу между стартом приложения и текущим моментом...
OS это черный ящик, если есть внутри этого ящика подписка на событие изменения времени по NTP то ваша цель решена, разумеется каждая OS по своему думает.VirtUX писал(а):Мне нужно отследить момент, когда ОС сама выполнит синхронизацию времени
погуглил есть у Windows событие WM_TIMECHANGE которое вызывается когда время изменяется.
Вы хакингом занимались? Там этот вопрос крайне остро стоит, хотя бы тем что можно целую OS посадить на VM через который может дебажить код взад и вперед. GetTickCount - это очень ненадежно.VirtUX писал(а):Как реализовать собственный "стабильный" таймер... Пользователь, стороннее ПО или ОС изменили системное время, а собственный таймер продолжает выдавать нужное время, как-будто время никто не менял. Постоянно синхронизировать его по NTP нельзя.
Выходы только два: 1) это быть постоянно онлайн и клиента жестко контролировать, туда можно отнести сертификаты которые имеют свой срок жизни и требовать подтверждения легальности у всяких центров подтверждения, они точно имеют независимые часы, если сертификат исток, то при следующей проверки - они вам сообщат отрицанием подтверждения.
2) иметь аппаратные ключи, типа HASP. Они имеют на борту свои энергонезависимые часы, в них, в некоторых аппаратных ключах можно разместить даже свой код, который может чекать сессии.
Других вариантов нет.
olegy123 писал(а):Windows событие WM_TIMECHANGE
Не кроссплатформенно. А CM_TIMECHANGE еще не реализовано, - ждём...
olegy123 писал(а):Вы хакингом занимались?
Нет. Бюджетными тайминговыми системами для соревнований.
olegy123 писал(а):2) иметь аппаратные ключи, типа HASP
Спасибо! Это вариант.
разумеется, что не кроссплатформенно. Но под каждую платформу можно заточить событие на изменение системных часов, в линуксе пишут нужно ловить TFD_TIMER_CANCEL_ON_SET в функции timerfd_settimeVirtUX писал(а):Не кроссплатформенно.
если нужно "сделать сам" и подешевле то могу посоветовать смастерить донгл на базе STM32, в чипе есть внутренние часы 8Мгц (RC -резистор-конденсатор), можно закварцеровать, точность резко возрастет. стоимость ~100/300 рублей. Купить все детали можно в любом магазине радиокомпонентов.VirtUX писал(а):Спасибо! Это вариант.
Связь можно наладить по USB-UART(STM эмулирует линк UART(Com-порт) по USB, в Windows/Linux появится устройство Com-порт) и питание подвести 5в. И свой хитрый код зашить в этот ARM
