zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
阅读:2557回复:8

API高手:谁能解释清楚这个有关Windows多媒体定时器的问题?

楼主#
更多 发布于:2004-11-28 21:29
我有几个关于Windows提供的多媒体定时器使用方面的问题希望高手解答:
1)函数timeSetEvent()的第一个参数(延迟时间)的取值范围如何
   确定?
2)多媒体定时器分辨率(Resolution)参数的具体含义是什么?其
   高或低对使用有什么影响?
3)MSDN对函数timeBeginPeriod(UINT uPeriod)的说明是:设置应
   用程序或设备驱动程序的最小定时器分辨率。对此我有几个疑
   问:
   a.这个函数设置的是分辨率的最小值么?还是设定当前分辨率?
    
   b.如果这个函数是设定当前分辨率,由于函数timeSetEvent()的
     第二个参数也可指定一个分辨率,那么这两个函数指定的分辨
     率意义相同么?如果这两个函数中指定的分辨率值不同系统将
     如何处理呢?
  
   c.按理说,这里指定的uPeriod的值应介于用函数timeGetDevCaps
     ()取得的系统允许最大分辨率与最小分辨率之间,否则调用此
     函数将返回TIMERR_NOCANDO,但是我用timeGetDevCaps()在我
     的系统上(CPU:Intel P4 2.4G,OS:WindowsXP,VC6.0)取得
     的分辨率最小和最大值分别为1和1000000,当我指定uPeriod=
     2000000时,函数返回正常值!(当指定0时,出错。)这是为
     什么?
4)我试过不使用timeBeginPeriod()设置分辨率而直接使用
   timeSetEvent()时,定时器一样正常工作(我用一个Win32控制台
   程序测试的),难道这个函数可用可不用么?
5)我这样调用函数timeSetEvent():
          timeSetEvent(1000,
                       2000,
                       lpTimeProc,
                       0,
                       TIME_PERIODIC);
   结果定时器同样是每一秒(1000毫秒)调用一次lpTimeProc过程
   而不是每2秒一次,经管这里指定分辨率为2000mS!事实上,即使
   指定得再大一些也无所谓,同样是1秒调用一次!这是为什么呢?
   分辨率在此到底起什么作用呢?
6)分辨率的高低对系统性能有直接影响么?当我在BIOS中将CPU的
   超线程关闭后使用多媒体定时器时,无论指定的分辨率为多少(
   从1到1000),在任务管理器中显示CPU使用率都为100%!但此时
   打开其他程序使用时并未感到明显变慢;当打开超线程时CPU使用
   率降到40%左右,不过两种情况下调整分辨率时,使用定时器的
   进程对CPU的占用率并无太大变化(事实上我认为没变化),这是
   怎么回事?到底分辨率对系统性能是如何影响的呢?

以上这些问题我在MSDN上没有找到详细、准确的答案,这虽然并不影响使用(至少我没发现有什么影响),但如果能深入、确切的了解他们,对于更安全、稳定的使用多媒体定时器编写须高精度定时的工业实时控制软件是会很有帮助的,如果哪位师傅有这方面的经验和更详细的资料,还望不吝赐教!谢谢!
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-29 09:15
????
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-11-29 11:07
timeSetEvent(1,1,&time_test,NULL,TIME_PERIODIC);

我都是这么用的。
第一个参数是要设定的时间,第二个参数是1,没去管他。没研究到底是怎么回事。

运行后,cpu基本没什么变化啊!
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-29 19:18
你真的需要每毫秒都处理一次time_test过程么?还是只须定时精度达
到1毫秒?如果只是要求精度就没必要1毫秒调用一次定时器过程,那样
太浪费CPU资源了,而且,问题的关键还不只这些,如果程序的其他部分
处理时间超过1毫秒,那么定时就一定不可能准了,你说对么?所以还是
应该弄清楚这些参数的详细意义才好。
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-11-30 16:51
你真的需要每毫秒都处理一次time_test过程么?还是只须定时精度达
到1毫秒?如果只是要求精度就没必要1毫秒调用一次定时器过程,那样
太浪费CPU资源了,而且,问题的关键还不只这些,如果程序的其他部分
处理时间超过1毫秒,那么定时就一定不可能准了,你说对么?所以还是
应该弄清楚这些参数的详细意义才好。


定时准不准不清楚,但大概时间差不多。其实我写出来的意思就是想告诉你知,我用这个函数的时候,cpu 没多大变化。

参数弄清楚当然好了,希望弄清楚后,贴出来,大家分享一下。 呵呵
 :D
kingtao
驱动牛犊
驱动牛犊
  • 注册日期2003-06-08
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-01 20:14
timeBeginPeriod如果不调用的话有一个缺省的分辨率
好像设置为0时是1ms,我就是这样用的
分辨率我想就是精确度的意思吧。
我用奔III一G时使用精度为1ms的10ms定时器,cpu的占用率为40%
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-03 13:21
楼主我发信给你了。有空查一下。
一个是设置Delay的时间,比如Ams。
另一个是设备Resolution,应该翻译成精度,比如Bms。
最后得到的定时在A-B ---- A+B之间都视为正常。
所以建议给B留一定的余量,可以一定程序减轻Windows排程的压力吧,我猜。
不过在我的机器上效果不明显。

另,在多线程、多任务系统上谈ms级的精确定时是没有意义的。
需要HW + Driver配合才能达到。
助人乃快乐之本 有人给分就更快乐了 :-)
steven__xu
驱动牛犊
驱动牛犊
  • 注册日期2004-08-24
  • 最后登录2013-09-03
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-03 15:58
细节记不清了,简单说一下概念。
多媒体应用有时候需要毫秒级精度的时钟,但是如果在任何时候都把硬件中断设为1ms,那会造成机器的效率降低,所以Windows把多媒体时钟做成了一个需要时才申请、用完就释放的资源,而且申请的时候还要说明需要多高的精度。

如果系统中没有任何一个程序用到多媒体时钟,硬件中断的周期是个比较长的默认值,在不同的操作系统上不一样,大约是10ms~55ms,所以,一般的程序里时钟精度大约是100ms数量级,不管是WM_TIMER还是GetSystemTime()都一样。

当应用程序申请了多媒体时钟,系统就对时钟芯片重新编程,减少中断周期,为了减少高精度时钟对系统性能的影响,系统并不总是将时钟编程为1ms,而是减到一个刚好满足需要的尽量大的值。如果有两个程序都申请多媒体时钟,系统也会调整到能够同时满足两者的需要。
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-03 21:02
grant我知道分对你来说只是个符号而已,不过亲兄弟明算帐,该给的还得给呀,你楼下的仁兄我也给了5分,还剩下5分留给其他能回答这个问题的人吧。
游客

返回顶部