奇怪的 ACE_High_Res_Timer

本来普通定时器用着挺好,但想试试这个高精度的定时器,结果发现十分钟的超时间隔,八分多钟就触发了,偏差的幅度倒是很固定。

之前没找着问题的原因就只好继续用普通定时器,但最近无意之中发现这个问题在公司的台式机上不存在!

然后就多试了几台机器,同样的程序,在公司台式机和服务器上运行都是好的(准确定时),在家里的两台笔记本上却都有问题(提前超时,加快的比例完全一致)。

尝试过不使用默认的 ACE_WMFO_Reactor,改用 ACE_Select_Reactor,尝试了版本新一些的 ACE 5.7.1(原来的是 5.6.1),问题依旧,另外,也基本排除了开发环境的原因(VS2005SP1 加上在线更新的一些补丁)。

难道是 CPU 的种类有关系?因为公司两台机器都只是有超线程技术的单核奔四,家里两台都是之后出的酷睿/奔腾双核。

简单看了下 ACE 中相关的处理代码,感觉问题有可能出在 global_scale_factor 的获取上面。虽然 ACE_High_Res_Timer 背后使用的都是各个系统提供的高精度定时器,但由于不同系统间的差异,使用的时候涉及到一个修正的问题。

跟踪运行了一下相关代码,大致流程:先 QueryPerformanceFrequency,结果是 3579545,然后除以 1000000(1秒内的微秒数)再取整,就得到 global_scale_factor 的值了,在我这也就是 3,和未取整前的数值 3.579545 之间的比例和我问题中的误差比例(10 分钟变成 8 分 20 秒左右)非常接近。

再然后就不知道该怎么办了,网上也查不到相关的讨论,不知道是不是我的用法有问题:(

另外,还找到一篇也是抱怨 ACE_High_Res_Timer 的帖子,虽然和我的问题不太相干,但更坚定我继续使用普通定时器的决心了。。。

 

This entry was posted in 软件开发 and tagged , . Bookmark the permalink.

2 条 奇怪的 ACE_High_Res_Timer 的回复

  1. 琉璃心说道:

    不了解ACE_High_Res_Timer。不过感觉用定时器的误差会有积累,所以不能用定时器。我们普通的个人电脑的时间误差几乎完全取决于晶体频率的准确程度,而个人电脑的上面所使用的时间的精度,主要取决于时钟源(硬件)的精度,个人电脑的那个时钟源(时钟芯片)的精度并不高。而且不同批次的个人电脑主板也不一样,那么所使用的时钟芯片的晶体频率也不一样,这样就会有时间误差。

  2. 说道:

    嗯,但定时器总归还是要用的。。。:)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s