我可以监视对系统时间调整的更改(通过更改SetSystemTimeAdjustment()
)吗?用于更改周期性时间调整的Windows通知
我需要监视这种变化以获得高精度的实时频谱图视图。
注:
我知道,每当系统时间更改WM_TIMECHANGE
发送。这不是我要求的。
我可以监视对系统时间调整的更改(通过更改SetSystemTimeAdjustment()
)吗?用于更改周期性时间调整的Windows通知
我需要监视这种变化以获得高精度的实时频谱图视图。
注:
我知道,每当系统时间更改WM_TIMECHANGE
发送。这不是我要求的。
我认为WM_TIMECHANGE被发送到的WndProc(),所以你会希望覆盖的WndProc是这样的:
public override void WndProc(ref Message m) {
if(m==WM_TIMECHANGE) {
//dostuff
}
base.WndProc();
}
这个MSDN杂志文章指出,没有在OS没有通知机制 - 您需要通过轮询GetSystemTimeAdjustment()
来监控更改。从"Implementing a Continuously Updating, High-Resolution Time Provider for Windows" by Johan Nilsson (MSDN Magazine, March 2004):
虽然这有几个问题。首先是启用(和更改)时间调整会改变您的参考频率 - 时间流。第二个问题是更大的问题,即时间调整更改,启用或禁用时系统未发送任何通知。即使在默认时间增量为156250单位的系统上,即使以最小可能增量(一个100纳秒单位)更改时间调整也会导致参考频率变化6.4 PPM(1/156250)。再一次,这可能听起来不太多,但考虑到您可能希望保持在距离系统时间50微秒以内,这可能意味着您在几秒钟后超过该限制而没有重新同步。
为减少此类调整的影响,时间提供商必须监视当前时间调整设置。没有操作系统本身的帮助,通过调用
SetSystemTimeAdjustment
配套APIGetSystemTimeAdjustment
来实现。通过在足够短的间隔内重复执行此检查并根据需要调整内部频率,可以避免漂移离系统时间太远。
自文章发布以来,可能已添加了对操作系统级通知的支持,但我没有发现任何记录。
谢谢。不过,可能会出现一些WMI事件或注册表更改,甚至可能会使用低级别的系统挂钩。 – 2010-08-17 20:13:27