为什么Windows 2K/XP/2K3系统的时钟前四秒快第五秒慢?

0
points

前一阵子,松鼠会中有人提到,Windows 系统中的秒针走起来,前四秒快,而后一秒慢。然后又说是今年才开始的,预示着地球的剧变,等等不着边际的话。很不以为然。但是,这种快慢不一的现象原来是真的,现在有人提供了一个解释,是程序的问题:

如果你细心注意过的话,点开2K/XP/2K3系统右下角的时钟,让他的秒针走动起来的时候,会出现一个很有意思的现象:前四秒钟数字和秒针变化的快,第五秒感觉却很长,这是为什么呢?

原因实际上出在那个表的精度上。

如果学过Windows的C++编程可以知道,WM_TIMER是常用的定时器。但这个定时器的精度不是很高。在Windows的Clock这个子程序中,实际上就是用了WM_TIMER进行定时。当显示秒针时,表的更新由这样一句语句触发:

SetTimer (hWnd, TimerID, OPEN_TLEN, 0L);

SetTimer的用法很简单,设置好Timer之后,每次触发就只要重新取当前时间重画表盘就可以了。那么OPEN_TLEN就是Timer的触发时间。这个时间是一个常量,在受到影响的系统里面被定义为450,也就是不到半秒。

定义成450ms会出现什么现象?我们来看一组数。第一行和第三行是更新的次数,他们下面是更新的毫秒数。

1 2 3 4 5 6 7 8
450 900 1350 1800 2250 2700 3150 3600

9 10 11 12 13 14 15 16
4050 4500 4950 5400 5850 6300 6750 7200

可以看到,在第一秒内(<1000)表实际上进行了两次更新,第二秒、第三秒、第四秒都是如此。而第五秒的时候,你就需要等三次更新才能看到(注意 9、10、11都是4xxx的样子)。因此就出现了这个怪异的现象:前四次都是数两下就会跳一秒,第五次要数三下才跳一秒,第五秒的出现时间比前四秒都多了50%,所以就感觉很长了。

那为什么要设计成这样?大概是因为这个表只是让你有个时间观念,只要不走错,秒级的响应并不重要吧……毕竟这个世界上没有多少人一天到晚盯着秒针数拍子的。

以上解释来自 opal.

我有个疑问是,有什么特别的理由把这个时间常量设成 450ms 么?

评论

设计成 450

设计成 450 可能是考虑了不要占用过多资源的缘故? 毕竟每次刷新还是要占用一下 CPU% 的. 当然也可能不是这样, 可能就是程序员自己根据经验设的值也说不定.

那这个钟就重来没走

那这个钟就重来没走准过?

x86 系统使用的

x86 系统使用的 8253/8254 定时计数器频率是 1193182 HZ
时钟滴答使用一个 16 位 word 保存,就是 1.193182 MZ / 65536 = 18.206 HZ
那么每秒钟有 18.206 次时间中断,也就是每隔 55 ms(54.925493ms) 一个中断

原来是这样,一直知

原来是这样,一直知道平时开发程序最短能够获得的timer是55ms,但不知道怎么来的。不过这么说的话,是不是那里就不应该是450ms?一个接近的数?

设计成450ms,则每小时

设计成450ms,则每小时更新的次数是整数,不会出现除不尽的现象。

当然了,未来系统更加先进了,选择9ms或者9ms的倍数(以2倍或5倍跳跃)也是可以的。

补充一下,时间是60进

补充一下,时间是60进制的,每小时有3600秒,要求这个更新时间必须是9的倍数,450符合这个要求。

其它数也行,该数要求必须能被9除一次,并被2或者5除零次或若干次后变为1,即可。

no,no~~

no,no~~ 只是程序员自己写的而已,内部的时钟频率当然是很高的。
MFC的定时器可以更快的,只是他没有做。
其实450ms不是一个很好的选择,450ms呀,对于现在计算机绝对是一个漫长的时间了。要我选个100ms多好。


吾爱吾师,我更爱真理
吾爱真理,我更爱自然之美啊

评论查看选项

选择您喜欢的显示评论的模式,并点击"保存设置"来激活您所做的改变。

发表新评论

此内容将保密,不会被其他人看见。