<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://gezhi.org" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
 <title>时钟</title>
 <link>http://gezhi.org/keyword/976</link>
 <description>The taxonomy view with a depth of 0.</description>
 <language>zh-hans</language>
<item>
 <title>为什么Windows 2K/XP/2K3系统的时钟前四秒快第五秒慢？</title>
 <link>http://gezhi.org/blog/yan/1006</link>
 <description>&lt;p&gt;前一阵子，松鼠会中有人提到，Windows 系统中的秒针走起来，前四秒快，而后一秒慢。然后又说是今年才开始的，预示着地球的剧变，等等不着边际的话。很不以为然。但是，这种快慢不一的现象原来是真的，现在&lt;a href=&quot;http://opal.spaces.live.com/blog/cns!8007EDF5C56FC334!2531.entry&quot;&gt;有人&lt;/a&gt;提供了一个解释，是程序的问题：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;如果你细心注意过的话，点开2K/XP/2K3系统右下角的时钟，让他的秒针走动起来的时候，会出现一个很有意思的现象：前四秒钟数字和秒针变化的快，第五秒感觉却很长，这是为什么呢？&lt;/p&gt;
&lt;p&gt;原因实际上出在那个表的精度上。&lt;/p&gt;
&lt;p&gt;如果学过Windows的C++编程可以知道，WM_TIMER是常用的定时器。但这个定时器的精度不是很高。在Windows的Clock这个子程序中，实际上就是用了WM_TIMER进行定时。当显示秒针时，表的更新由这样一句语句触发：&lt;/p&gt;
&lt;p&gt;SetTimer (hWnd, TimerID, OPEN_TLEN, 0L);&lt;/p&gt;
&lt;p&gt;SetTimer的用法很简单，设置好Timer之后，每次触发就只要重新取当前时间重画表盘就可以了。那么OPEN_TLEN就是Timer的触发时间。这个时间是一个常量，在受到影响的系统里面被定义为450，也就是不到半秒。&lt;/p&gt;
&lt;p&gt;定义成450ms会出现什么现象？我们来看一组数。第一行和第三行是更新的次数，他们下面是更新的毫秒数。&lt;/p&gt;
&lt;p&gt;1      2      3        4        5        6        7        8&lt;br /&gt;
450  900  1350  1800  2250  2700  3150  3600&lt;/p&gt;
&lt;p&gt;9        10      11      12      13      14      15      16&lt;br /&gt;
4050  4500  4950  5400 	5850  6300  6750  7200&lt;/p&gt;
&lt;p&gt;可以看到，在第一秒内（&lt;1000）表实际上进行了两次更新，第二秒、第三秒、第四秒都是如此。而第五秒的时候，你就需要等三次更新才能看到（注意 9、10、11都是4xxx的样子）。因此就出现了这个怪异的现象：前四次都是数两下就会跳一秒，第五次要数三下才跳一秒，第五秒的出现时间比前四秒都多了50%，所以就感觉很长了。&lt;/p&gt;
&lt;p&gt;那为什么要设计成这样？大概是因为这个表只是让你有个时间观念，只要不走错，秒级的响应并不重要吧……毕竟这个世界上没有多少人一天到晚盯着秒针数拍子的。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;以上解释来自 &lt;a href=&quot;http://opal.spaces.live.com/blog/cns!8007EDF5C56FC334!2531.entry&quot;&gt;opal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;我有个疑问是，有什么特别的理由把这个时间常量设成 450ms 么？&lt;/p&gt;
</description>
 <comments>http://gezhi.org/blog/yan/1006#comments</comments>
 <category domain="http://gezhi.org/technology">工程技术</category>
 <category domain="http://gezhi.org/keyword/975">Windows</category>
 <category domain="http://gezhi.org/keyword/976">时钟</category>
 <pubDate>Tue, 27 May 2008 18:32:04 -0700</pubDate>
 <dc:creator>Yan</dc:creator>
 <guid isPermaLink="false">1006 at http://gezhi.org</guid>
</item>
</channel>
</rss>
