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不适合做高精度计时器.
TIMER不适合做高精度计时器.
#5
恩, 想再问个问题。
MFC中的 Sleep(??)
也是这个情况么?
如果是, 该怎么样,用其它方法解决。
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
Windows并非实时系统,其中时间精度最小只能10ms(XP下只能15ms)
不论是SetTimer定时器,还是Sleep都只能在这个精度以上
不过你可以使用多媒体定时器来实现你的功能,精度可以到1ms的
timeSetTimer
#12
嗯,timeSetEvent还是可以的,之前用这个做过精确到1ms的视频定时采集,效果可以
不过要注意进程最多开16个
不过要注意进程最多开16个
#13
归纳的一个多媒体定时器应用的类
http://blog.csdn.net/zgl7903/archive/2008/06/25/2584675.aspx
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函数。
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)左右,所以参数小于这个数的时候,不管用哪个,基本没有太大的差别
使用了sleep,会有线程的切换,即使Sleep(1),加上线程切换时间,也就相当于Sleep(15)左右,所以参数小于这个数的时候,不管用哪个,基本没有太大的差别
#19
如果想作精确定时,可以考虑使用多媒体定时器,我用过
基本上可以定时1毫秒,一般情况下误差就在1毫秒
基本上可以定时1毫秒,一般情况下误差就在1毫秒
#20
顶 1 楼, WM_TIMER消息代表的定时器本身就精度很低
楼主在网上找找关于精确定时的文章就明白了
楼主在网上找找关于精确定时的文章就明白了
#21
定时器的精度和MFC没关系,和操作系统有关.
#22
WM_TIMER确实精度差,而且消息多了之后会被抛弃的
#23
ding
ding
ding
#24
WM_TIMER
SetTimer好像只能到五十几个毫秒吧
SetTimer好像只能到五十几个毫秒吧
#25
貌似是55,不过貌似xp系统上的话就又好一些
#26
用多媒体时钟,精度高些.
不建议用Waitable Timer ,他是异步调用回调函数,更是不精确.
#27
学习。。。
#1
WM_TIMER消息代表的定时器本身就精度很低,而且受环境影响很大(延迟1万倍都有可能),适用于低精度定时器操作。如果真在乎精度,建议使用Waitable Timer,在其他线程中执行定时操作。
#2
楼1所说即是~
#3
用高精度的吧,每个进程可以开16个
#4
老问题了.
TIMER不适合做高精度计时器.
TIMER不适合做高精度计时器.
#5
恩, 想再问个问题。
MFC中的 Sleep(??)
也是这个情况么?
如果是, 该怎么样,用其它方法解决。
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
Windows并非实时系统,其中时间精度最小只能10ms(XP下只能15ms)
不论是SetTimer定时器,还是Sleep都只能在这个精度以上
不过你可以使用多媒体定时器来实现你的功能,精度可以到1ms的
timeSetTimer
#12
嗯,timeSetEvent还是可以的,之前用这个做过精确到1ms的视频定时采集,效果可以
不过要注意进程最多开16个
不过要注意进程最多开16个
#13
归纳的一个多媒体定时器应用的类
http://blog.csdn.net/zgl7903/archive/2008/06/25/2584675.aspx
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函数。
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)左右,所以参数小于这个数的时候,不管用哪个,基本没有太大的差别
使用了sleep,会有线程的切换,即使Sleep(1),加上线程切换时间,也就相当于Sleep(15)左右,所以参数小于这个数的时候,不管用哪个,基本没有太大的差别
#19
如果想作精确定时,可以考虑使用多媒体定时器,我用过
基本上可以定时1毫秒,一般情况下误差就在1毫秒
基本上可以定时1毫秒,一般情况下误差就在1毫秒
#20
顶 1 楼, WM_TIMER消息代表的定时器本身就精度很低
楼主在网上找找关于精确定时的文章就明白了
楼主在网上找找关于精确定时的文章就明白了
#21
定时器的精度和MFC没关系,和操作系统有关.
#22
WM_TIMER确实精度差,而且消息多了之后会被抛弃的
#23
ding
ding
ding
#24
WM_TIMER
SetTimer好像只能到五十几个毫秒吧
SetTimer好像只能到五十几个毫秒吧
#25
貌似是55,不过貌似xp系统上的话就又好一些
#26
用多媒体时钟,精度高些.
不建议用Waitable Timer ,他是异步调用回调函数,更是不精确.
#27
学习。。。