时钟的问题 我有一个采集任务 需要每隔1秒钟采集一次 用settimer 但是发现有的时候在1秒钟内该任务做了两次 有的时候1秒钟内该任务没有做,我想这个应该是由于windows系统时钟不精确的缘故,有什么好的解决办法么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不可能吧,settimer你设置定时器为一秒,在OnTimer()中执行你要的操作,和windows系统时钟不精确应该没有关系的 OnTimer()中执行你要的操作的时间长短直接导致你的TIMER不准确。因为timer消息是会等待的,如果你的间隔时间是1秒,你在OnTimer()中执行你要的操作的时间大于1秒,那下一个TIMER消息就会在消息队列里等你执行完操作后再到来,这个TIMER的间隔就大于1秒了。而再下一个TIMER如果也在消息队列里等待,则这个TIMER的执行完后下一个就会立刻执行,所以下个时间就等于执行时间,有可能不足一秒。如果第一个TIMER的执行时间占了2秒以上的话,如果每次OnTimer()中执行你要的操作的时间都比TIMER的间隔短的话,就不会出现上面的现象。另外TIMER的最小精度是10到100毫秒之间。 完全有可能一秒做2次。比如Timer的误差为50ms(~18.2次/秒),就可能在25ms做一次,到975ms又做一次。 按照windouws自己来检测的话,那是不是按照系统自己的时间确实是每秒一次没有问题呢?如果检测机制也是在同样的环境下运行的话,还是发现不了问题啊…… 建议timer设置成100ms然后程序判断“每秒1次” 由于timer优先级较低,很有可能已接收到Timer消息后,由于给其他进程抢先执行,影响每次执行间隔。解决办法请参照游戏设计的方法编写,很多游戏设计教程都有。 同意8楼,我想的暂时解决办法也是如此其实设成50ms或20ms判断一次也行,判断的部分精简一点,并不占用很多资源的获取系统时间进行秒级别的判别就行了,新的一秒来了就记录 SetTimer 是同步的,要准确就开个线程,专门计时~~~ 这位兄台所言差矣。windows中settimer时间精度是15.625ms(1/64秒)。time间隔设为1000ms的话不会应为这个精度影响计时效果。间隔990ms倒有可能(实际是)984.375ms 不可能吧,settimer你设置定时器为一秒,在OnTimer()中执行你要的操作,和windows系统时钟不精确应该没有关系的 试试直接在消息循环里用GetTickCount判断过了多少时间,然后每过1秒就做一次任务。 由于timer优先级较低,很有可能已接收到Timer消息后,由于给其他进程抢先执行,影响每次执行间隔。解决办法请参照游戏设计的方法编写,很多游戏设计教程都有。 CTreeView类中引用自定义CTreeCtrl的问题 右下角的信息提示 类似 QQ 或者MSN 请问在ActiveX里面创建线程在理论上有什么缺陷吗,可以被提倡吗 安装Hook后,程序退出导致hook的dll被卸载么? 问一些很简单的问题,我只是手头上没有资料 为什么我的树状控件里面插如icon背景显示的都是黑色的,怎么变成透明的? 练手问题:请问怎样在vc中创建圆形button,虽然很简单但我不会,望大侠赐教! 窗体居中 VC 开发OCX 后的超奇怪的问题 请高人帮忙啊! 十万火急的问题:有关串行化的问题 FAT是怎么用的? 如何把屏幕或者Form1的TImage类的长宽用数组表示
因为timer消息是会等待的,如果你的间隔时间是1秒,你在OnTimer()中执行你要的操作的时间大于1秒,那下一个TIMER消息就会在消息队列里等你执行完操作后再到来,这个TIMER的间隔就大于1秒了。而再下一个TIMER如果也在消息队列里等待,则这个TIMER的执行完后下一个就会立刻执行,所以下个时间就等于执行时间,有可能不足一秒。如果第一个TIMER的执行时间占了2秒以上的话,如果每次OnTimer()中执行你要的操作的时间都比TIMER的间隔短的话,就不会出现上面的现象。
另外TIMER的最小精度是10到100毫秒之间。
如果检测机制也是在同样的环境下运行的话,还是发现不了问题啊……
其实设成50ms或20ms判断一次也行,判断的部分精简一点,并不占用很多资源的
获取系统时间进行秒级别的判别就行了,新的一秒来了就记录
这位兄台所言差矣。windows中settimer时间精度是15.625ms(1/64秒)。time间隔设为1000ms的话不会应为这个精度影响计时效果。
间隔990ms倒有可能(实际是)984.375ms