2010-08-17 81 views
1

我可以监视对系统时间调整的更改(通过更改SetSystemTimeAdjustment())吗?用于更改周期性时间调整的Windows通知

我需要监视这种变化以获得高精度的实时频谱图视图。

注:

我知道,每当系统时间更改WM_TIMECHANGE发送。这不是我要求的。

回答

0

我认为WM_TIMECHANGE被发送到的WndProc(),所以你会希望覆盖的WndProc是这样的:

public override void WndProc(ref Message m) { 
    if(m==WM_TIMECHANGE) { 
     //dostuff 
    } 
    base.WndProc(); 
} 
2

这个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配套API GetSystemTimeAdjustment来实现。通过在足够短的间隔内重复执行此检查并根据需要调整内部频率,可以避免漂移离系统时间太远。

自文章发布以来,可能已添加了对操作系统级通知的支持,但我没有发现任何记录。

+0

谢谢。不过,可能会出现一些WMI事件或注册表更改,甚至可能会使用低级别的系统挂钩。 – 2010-08-17 20:13:27

相关问题