Chinaunix首页 | 论坛 | 博客
  • 博客访问: 717138
  • 博文数量: 126
  • 博客积分: 2944
  • 博客等级: 上校
  • 技术积分: 1160
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-17 11:09
个人简介

文章分类

全部博文(126)

文章存档

2022年(1)

2018年(1)

2017年(5)

2016年(5)

2013年(5)

2012年(21)

2011年(24)

2010年(1)

2009年(2)

2008年(12)

2007年(6)

2006年(19)

2005年(24)

分类:

2008-05-29 09:46:14

前一阵子,松鼠会中有人提到,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   17
4050 4500 4950 5400 5850 6300 6750 7200 7650

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

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

以上解释来自 opal.

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

阅读(1843) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

flightbird2013-01-08 14:33:39

chinaunix网友: 把你博客文章看了一个晚上,收集的很精辟,学习了,加油.....
哦,多谢。呵呵。一起进步吧。

chinaunix网友2009-03-01 21:24:33

把你博客文章看了一个晚上,收集的很精辟,学习了,加油