关于MFC定时器不准的问题

时间:2022-01-07 18:10:39

SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );

第二个参数应该是毫秒的。
我设置的参数,从10000(10秒)到1000(1秒)到100(100毫秒)到10(10毫秒)都是正常的

可是把参数设置到10以内的,好象效果是全部都是10毫秒的效果。

不知道MFC是不是就是这样的, 如果是这样的话, 那该在MFC程序,该如何解决。

27 个解决方案

#1


WM_TIMER消息代表的定时器本身就精度很低,而且受环境影响很大(延迟1万倍都有可能),适用于低精度定时器操作。如果真在乎精度,建议使用Waitable Timer,在其他线程中执行定时操作。

#2


楼1所说即是~

#3


用高精度的吧,每个进程可以开16个

#4


老问题了.
TIMER不适合做高精度计时器.

#5


恩,  想再问个问题。

MFC中的  Sleep(??)
也是这个情况么?

如果是, 该怎么样,用其它方法解决。

#6


http://www.naughter.com/cputicker.html 
看看这个,高精度的。

#7


http://www.vckbase.com/document/viewdoc/?id=1234

#8


#9


SetTimer是不精确的定时器,如果想要精确,使用多媒体定時器,但有個限制,每個進程只能開16個

#10


肯定不准。。。 。。。又不是秒表。。。。

#11


这是Windows系统的限值
Windows并非实时系统,其中时间精度最小只能10ms(XP下只能15ms)

不论是SetTimer定时器,还是Sleep都只能在这个精度以上


不过你可以使用多媒体定时器来实现你的功能,精度可以到1ms的
timeSetTimer

#12


嗯,timeSetEvent还是可以的,之前用这个做过精确到1ms的视频定时采集,效果可以
不过要注意进程最多开16个

#13


归纳的一个多媒体定时器应用的类
http://blog.csdn.net/zgl7903/archive/2008/06/25/2584675.aspx

#14


study.........

#15


用定时器的方法不能这样精确的计时,因为WINDOWS不是一个实时的操作系统,所以它的定时器只能精确到这些,要更精确的计时,要用别的机智!

#16


太小是没有办法的,关键是调度程序的问题,你的程序运行期间只要被其他的线程占用了时间片就会有影响的。

#17


MSDN中SetTimer函数的说明:
uElapse
[in] Specifies the time-out value, in milliseconds. 
Windows NT/2000/XP: If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to 1.

Windows 2000/XP: If uElapse is less than USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM.

Windows Server 2003: If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to USER_TIMER_MAXIMUM.

Windows XP SP2/Windows Server 2003 SP1: If uElapse is less than USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM. If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to USER_TIMER_MAXIMUM.

此外,SetTimer定时也是很不准的。如果要求较高的精度,可以用CreateWaitableTimer、SetWaitableTimer函数。

#18


这并不是算法等方面的不准,而是其处理方式决定的
使用了sleep,会有线程的切换,即使Sleep(1),加上线程切换时间,也就相当于Sleep(15)左右,所以参数小于这个数的时候,不管用哪个,基本没有太大的差别

#19


如果想作精确定时,可以考虑使用多媒体定时器,我用过
基本上可以定时1毫秒,一般情况下误差就在1毫秒

#20


顶 1 楼, WM_TIMER消息代表的定时器本身就精度很低
楼主在网上找找关于精确定时的文章就明白了

#21


定时器的精度和MFC没关系,和操作系统有关.

#22


WM_TIMER确实精度差,而且消息多了之后会被抛弃的

#23


ding
ding

#24


WM_TIMER
SetTimer好像只能到五十几个毫秒吧

#25


引用 24 楼 MBWQ 的回复:
WM_TIMER
SetTimer好像只能到五十几个毫秒吧


貌似是55,不过貌似xp系统上的话就又好一些

#26


引用 1 楼 jameshooo 的回复:
WM_TIMER消息代表的定时器本身就精度很低,而且受环境影响很大(延迟1万倍都有可能),适用于低精度定时器操作。如果真在乎精度,建议使用Waitable Timer,在其他线程中执行定时操作。

用多媒体时钟,精度高些.
不建议用Waitable Timer ,他是异步调用回调函数,更是不精确.

#27


学习。。。

#1


WM_TIMER消息代表的定时器本身就精度很低,而且受环境影响很大(延迟1万倍都有可能),适用于低精度定时器操作。如果真在乎精度,建议使用Waitable Timer,在其他线程中执行定时操作。

#2


楼1所说即是~

#3


用高精度的吧,每个进程可以开16个

#4


老问题了.
TIMER不适合做高精度计时器.

#5


恩,  想再问个问题。

MFC中的  Sleep(??)
也是这个情况么?

如果是, 该怎么样,用其它方法解决。

#6


http://www.naughter.com/cputicker.html 
看看这个,高精度的。

#7


http://www.vckbase.com/document/viewdoc/?id=1234

#8


#9


SetTimer是不精确的定时器,如果想要精确,使用多媒体定時器,但有個限制,每個進程只能開16個

#10


肯定不准。。。 。。。又不是秒表。。。。

#11


这是Windows系统的限值
Windows并非实时系统,其中时间精度最小只能10ms(XP下只能15ms)

不论是SetTimer定时器,还是Sleep都只能在这个精度以上


不过你可以使用多媒体定时器来实现你的功能,精度可以到1ms的
timeSetTimer

#12


嗯,timeSetEvent还是可以的,之前用这个做过精确到1ms的视频定时采集,效果可以
不过要注意进程最多开16个

#13


归纳的一个多媒体定时器应用的类
http://blog.csdn.net/zgl7903/archive/2008/06/25/2584675.aspx

#14


study.........

#15


用定时器的方法不能这样精确的计时,因为WINDOWS不是一个实时的操作系统,所以它的定时器只能精确到这些,要更精确的计时,要用别的机智!

#16


太小是没有办法的,关键是调度程序的问题,你的程序运行期间只要被其他的线程占用了时间片就会有影响的。

#17


MSDN中SetTimer函数的说明:
uElapse
[in] Specifies the time-out value, in milliseconds. 
Windows NT/2000/XP: If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to 1.

Windows 2000/XP: If uElapse is less than USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM.

Windows Server 2003: If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to USER_TIMER_MAXIMUM.

Windows XP SP2/Windows Server 2003 SP1: If uElapse is less than USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM. If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to USER_TIMER_MAXIMUM.

此外,SetTimer定时也是很不准的。如果要求较高的精度,可以用CreateWaitableTimer、SetWaitableTimer函数。

#18


这并不是算法等方面的不准,而是其处理方式决定的
使用了sleep,会有线程的切换,即使Sleep(1),加上线程切换时间,也就相当于Sleep(15)左右,所以参数小于这个数的时候,不管用哪个,基本没有太大的差别

#19


如果想作精确定时,可以考虑使用多媒体定时器,我用过
基本上可以定时1毫秒,一般情况下误差就在1毫秒

#20


顶 1 楼, WM_TIMER消息代表的定时器本身就精度很低
楼主在网上找找关于精确定时的文章就明白了

#21


定时器的精度和MFC没关系,和操作系统有关.

#22


WM_TIMER确实精度差,而且消息多了之后会被抛弃的

#23


ding
ding

#24


WM_TIMER
SetTimer好像只能到五十几个毫秒吧

#25


引用 24 楼 MBWQ 的回复:
WM_TIMER
SetTimer好像只能到五十几个毫秒吧


貌似是55,不过貌似xp系统上的话就又好一些

#26


引用 1 楼 jameshooo 的回复:
WM_TIMER消息代表的定时器本身就精度很低,而且受环境影响很大(延迟1万倍都有可能),适用于低精度定时器操作。如果真在乎精度,建议使用Waitable Timer,在其他线程中执行定时操作。

用多媒体时钟,精度高些.
不建议用Waitable Timer ,他是异步调用回调函数,更是不精确.

#27


学习。。。