关于GetTickCount的疑惑

CONGCONG1105 2009-10-30 03:07:28
我用GetTickCount计时采集数据,出现如下问题

比如采集10分钟,从12:20:00开始,取此时的GetTickCount的值保存在变量x中,计时器间隔设为10或者20,每次触发计时器事件时取GetTickCount的值保存在变量y中,做如下判断

if y-x<=10*60*1000 then
继续采集
else
采集结束
end if

有时候采集得很正常,正好在12:30:00结束,但是有时候很奇怪,在12:28:48就结束了,y-x的值也大于10*60*1000 ,每次的异常时间误差几乎都是这么多,72秒左右吧,郁闷死我了,GetTickCount应该是很精确的啊,为什么会出现这种情况呢?
...全文
1100 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
CONGCONG1105 2009-11-04
  • 打赏
  • 举报
回复
谢谢大胡子
getemail 2009-11-04
  • 打赏
  • 举报
回复
LZ的问题都一周了,砖家们无视啊

[Quote=引用 48 楼 congcong1105 的回复:]
引用 47 楼 chenjl1031 的回复:
跟装没装VB没有啥关系!你是怎么用的?
还有,你是不是用了其他控件(比如OCX,DLL等第三方控件),需要注册。最好用打包软件(比如:Setup Factory 7.01)打包后全套安装,这样才能保证所需的控件都能注册。


我没用第三方控件啊,并且以前运行都是正常的,加了这两个函数以后就出现错误了,是不是还有什么需要注意的地方?
[/Quote]
CONGCONG1105 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 chenjl1031 的回复:]
跟装没装VB没有啥关系!你是怎么用的?
还有,你是不是用了其他控件(比如OCX,DLL等第三方控件),需要注册。最好用打包软件(比如:Setup Factory 7.01)打包后全套安装,这样才能保证所需的控件都能注册。
[/Quote]

我没用第三方控件啊,并且以前运行都是正常的,加了这两个函数以后就出现错误了,是不是还有什么需要注意的地方?
东方之珠 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 congcong1105 的回复:]
引用 43 楼 chenjl1031 的回复:
引用 42 楼 congcong1105 的回复:
我的采集数据代码放在回调函数CALLBACK_Timer里是吧,谢谢,我试一下


注意t累加一次是100毫秒(timeSetEvent的第一个参数值)。


这两个函数在我机器上好使,但是在没装VB的机器上出现内存错误,API需要的dll文件机器上也有,会是什么问题呢?
[/Quote]


跟装没装VB没有啥关系!你是怎么用的?
还有,你是不是用了其他控件(比如OCX,DLL等第三方控件),需要注册。最好用打包软件(比如:Setup Factory 7.01)打包后全套安装,这样才能保证所需的控件都能注册。
CONGCONG1105 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 chenjl1031 的回复:]
引用 42 楼 congcong1105 的回复:
我的采集数据代码放在回调函数CALLBACK_Timer里是吧,谢谢,我试一下


注意t累加一次是100毫秒(timeSetEvent的第一个参数值)。
[/Quote]

这两个函数在我机器上好使,但是在没装VB的机器上出现内存错误,API需要的dll文件机器上也有,会是什么问题呢?
Tiger_Zhao 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 congcong1105 的回复:]a.10*60*1000变量是double类型的啊,会产生溢出吗?
b.采集的间隔精确到100ms,如果判断 当前时间>=结束时间的话有有误差啊,我想把误差减小[/Quote]
a)哪个类型是 double?
b)用 Timer() 函数足矣。
yanhcl2 2009-11-02
  • 打赏
  • 举报
回复
我顶一下
东方之珠 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 congcong1105 的回复:]
我的采集数据代码放在回调函数CALLBACK_Timer里是吧,谢谢,我试一下
[/Quote]

注意t累加一次是100毫秒(timeSetEvent的第一个参数值)。
CONGCONG1105 2009-10-30
  • 打赏
  • 举报
回复
我的采集数据代码放在回调函数CALLBACK_Timer里是吧,谢谢,我试一下
东方之珠 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 congcong1105 的回复:]
29楼的大哥还在不?
[/Quote]

timeSetEvent可以精确到10毫秒,其第一个参数为触发的时间间隔,第二个参数是设置的允许误差值。
CONGCONG1105 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 tiger_zhao 的回复:]
a)下面这个表达式就会产生溢出错误
VB code10*60*1000

b)本身就是按分钟数来采集的,根本不需要 GetTickCount。
只需要开始时求出一个结束时间,然后按半秒的定时间隔来检查 当前时间>=结束时间 就可以了。
[/Quote]

a.10*60*1000变量是double类型的啊,会产生溢出吗?
b.采集的间隔精确到100ms,如果判断 当前时间>=结束时间的话有有误差啊,我想把误差减小
Tiger_Zhao 2009-10-30
  • 打赏
  • 举报
回复
a)下面这个表达式就会产生溢出错误
10*60*1000 


b)本身就是按分钟数来采集的,根本不需要 GetTickCount。
只需要开始时求出一个结束时间,然后按半秒的定时间隔来检查 当前时间>=结束时间 就可以了。
CONGCONG1105 2009-10-30
  • 打赏
  • 举报
回复
29楼的大哥还在不?
CONGCONG1105 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 of123 的回复:]
x = GetTickCount() + 10*60*1000

Do Until x <= GetTickCount()

  继续采集

  DoEvents

Loop
[/Quote]

我是每隔100ms采集一次,一共采集10分钟啊,不是连续不断地采集
of123 2009-10-30
  • 打赏
  • 举报
回复
x = GetTickCount() + 10*60*1000

Do Until x <= GetTickCount()

继续采集

DoEvents

Loop
CONGCONG1105 2009-10-30
  • 打赏
  • 举报
回复
但是怎么运用到我的程序中,我不会啊,数据采集的代码放哪啊?
东方之珠 2009-10-30
  • 打赏
  • 举报
回复
还有29楼这个代码:连续按住最大化、最小化按钮,计时也不会受影响。
jhone99 2009-10-30
  • 打赏
  • 举报
回复
貌似vb的多线程不太好,运行其他代码时会影响timer触发,如果TimeSetEvent真的不受外界干扰,建议lz采用chenjl1031的建议
东方之珠 2009-10-30
  • 打赏
  • 举报
回复
楼主可以测试一下29楼这个:鼠标按住标题栏,拖动标题栏,缩放窗体,拖动窗体等,计时均不会受影响。
CONGCONG1105 2009-10-30
  • 打赏
  • 举报
回复
是计时器太多的缘故吗?这个程序中用了9个,但是不是一起运行,大部分都是不可用的,只在需要的时候激发。
加载更多回复(30)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧