Уведомление Windows об изменении периодической корректировки времени - PullRequest
1 голос
/ 17 августа 2010

Можно ли отслеживать изменения в настройке системного времени (которая изменяется на SetSystemTimeAdjustment())?

Мне нужно отслеживать такие изменения для высокоточного просмотра спектрограммы в реальном времени.

Примечание:

Я знаю, что WM_TIMECHANGE отправляется всякий раз, когда изменяется системное время. Это не то, что я прошу.

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

В этой статье MSDN Magazine указывается, что в ОС нет механизма уведомлений - вам нужно отслеживать изменения, опрашивая GetSystemTimeAdjustment().От «Внедрение постоянно обновляемого провайдера времени с высоким разрешением для Windows» Йохана Нильссона (журнал MSDN, март 2004 г.) :

С этим связано несколько проблем,хоть.Во-первых, включение (и изменение) настройки времени изменяет вашу опорную частоту - поток времени.Вторая проблема, которая является более серьезной, заключается в том, что система не отправляет уведомление при изменении, включении или отключении настройки времени.Изменение настроек времени даже минимально возможное приращение (один 100-наносекундный блок) в системе с временным умолчанию приращением 156250 единиц вызывает изменение опорной частоты 6.4 PPM (1/156250).Опять же, это может показаться не таким уж большим, но, учитывая, что вы, возможно, захотите остаться в пределах 50 микросекунд от системного времени, это может означать, что вы превысите этот предел через несколько секунд без повторной синхронизации.

Чтобы уменьшитьВлияние таких корректировок, поставщик времени должен контролировать текущие настройки корректировки времени.Без помощи самой операционной системы это реализуется путем вызова SetSystemTimeAdjustment сопутствующего API GetSystemTimeAdjustment.Выполняя эту проверку несколько раз с достаточно короткими интервалами и регулируя внутреннюю частоту по мере необходимости, вы можете избежать слишком большого отклонения от системного времени.

Возможно, что поддержка уведомлений на уровне ОС добавлена, посколькустатья была опубликована, но я не нашел ничего задокументированного.

0 голосов
/ 17 августа 2010

Я предполагаю, что WM_TIMECHANGE отправляется в WndProc (), поэтому вы захотите переопределить ЧТО-ТО WndProc следующим образом:

public override void WndProc(ref Message m) {
    if(m==WM_TIMECHANGE) {
        //dostuff
    }
    base.WndProc();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...