我要发布
仪器网/ 仪器社区/ 计时器/ vb计时器为何有如此大的误差

vb计时器为何有如此大的误差

榛橀粯馃惏    2013-07-08    计时器    浏览 436 次

我用vb写了一个关机器(秒为单位),在form1中画了两个text框,一个命令按钮,一个表timer2,然后写了如下代码 Dim a As Single '声明变量a Private Sub Command1_Click() '按钮单击事件 a = Val(Text1.Text) ... 我用vb写了一个关机器(秒为单位),在form1中画了两个text框,一个命令按钮,一个表timer2,然后写了如下代码
Dim a As Single '声明变量a

Private Sub Command1_Click() '按钮单击事件
a = Val(Text1.Text) '
Timer2.Interval = 100 '
Timer2.Enabled = True

End Sub

Private Sub Form_Load()

Timer2.Enabled = False

End Sub

Private Sub Timer2_Timer()
a = a - 0.1 '每0.1秒示数减小0.1
Text2.Text = Str(a)
If Val(Text2.Text) <= 0 Then
Timer2.Enabled = False
Shell "shutdown -s -t 300" '计时结束5分钟后关机
Text2.Text = "时间到!"
Timer1.Enabled = False '结束计时
End If

End Sub

运行时我用秒表掐了一分钟,用vb做的计时器竟然比秒表慢将近10秒,并且过程中剩余时间出现了一大串小数
怎么回事?是不是由于计时器0.1秒就更新一次,时间更新间存在误差?
那么这个计时器该怎么改?

精彩问答
吃出身材 发布日期:2013-07-09
因为这个涉及到两方面,操作系统和程序本身。每个进程都有自己的时间片,时间片用完了就暂停执行这个进程的代码。另一方面,Private Sub Timer2_Timer()
里面的代码看似不多,其实要我们从底层一点点写封装上来,那代码可是相当多。
假如你让它在0.1s内执行0.11s的代码,很明显办不到。执行Timer2_Timer()还没完,如果定时器时间又到了,要么这个时间到 被忽略,要么被推到下次,不管哪种情况都造成时间误差累积。

所以,这两个原因一起造成Timer2过程里面的代码不能在0.1ms内完成。
系统方面,假设你的程序的时间片20ms,有40个进程(不包括隐藏进程)。这样下来在39×20ms内,
Timer2_Timer()不被执行,等到进程被切换到时才执行。
程序方面,vb是基于对象的,调试时是解释执行的,速度不快,编译后也要依赖运行库。一个小控件其实是一个庞大的东东,读取、修改它的一个属性,实际是一层又一层的调用封装的函数。
所以你的0.1s要它完成不简单的事情,对它很苛刻。
我用vb时,一般都不敢把timer控件的Interval设的很小。也不敢让他完成很复杂的任务。
被采纳
wenqsrose 发布日期:2013-07-09
将下面程序粘贴到记事本中,保存后将文件的类型.txt改成.vbs
on error resume next
set X = wscript.createobject("wscript.shell")
X.run "cmd.exe /c shutdown -r -t 600 -c ""十分钟内输入不正确将关机!",0,True
do while Y<>"password"
Y = inputbox ("请输入正确密码","输入窗口","",5000,7000) '清空输入框,位置在5000,7000处
msgbox "【"+Y+"】",0,"输入的密码是:"
loop
X.run "cmd.exe /c shutdown -a",0,True
msgbox "输入正确!"
全部评论
wszaizhj 发布日期:2013-07-09
我试过也是!
最新主题
相关版块
我要评论
X您尚未登录
账号登录
X您尚未登录
手机动态密码登录
X您尚未登录
扫码登录
官方微信

仪器网微信服务号

扫码获取最新信息


仪器网官方订阅号

扫码获取最新信息

在线客服

咨询客服

在线客服
工作日:  9:00-18:00
联系客服 企业专属客服
电话客服:  400-822-6768
工作日:  9:00-18:00
订阅商机

仪采招微信公众号

采购信息一键获取海量商机轻松掌控