doevents 和 timer 的冲突?

loveme_wife 2009-10-30 04:41:08
我的程序大要内容如下:

代码....
延时()
代码...

一开始用Sleep做的延时,但程序会显得好卡一个,
现在用GetTickCount和doevents做的延时,发现程序出了异常
经过测试,用doevents在延时过程中,timer会被继续执行

有没有什么好的办法,可以即让程序不卡,又能达到延时效果啊

延时函数如下:
Private Sub YanShi(YsNum As Long)
Dim tTime As Long
tTime = GetTickCount
Do
DoEvents
Loop Until GetTickCount - tTime > YsNum
End Sub
...全文
175 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-11-06
  • 打赏
  • 举报
回复
由于DoEvnets是将CPU使用权让出来,会是程序执行出现非常规的跳转,所以使用DoEvents必须要注意:
1、变量必须先声明后使用。
2、程序构思严谨,不能有逻辑混乱的情况出现。
赵4老师 2009-11-06
  • 打赏
  • 举报
回复
dim done1 as Boolean
Private Sub TimerSleep_Timer()
TimerSleep.Interval = 0
TimerSleep.Enabled = False
done1 = True
End Sub
Sub sleep1(ms)
done1 = False
TimerSleep.Interval = ms
TimerSleep.Enabled = True
Do
DoEvents
Loop Until done1
End Sub
Sub A()
...
sleep1(1000) '延迟1秒
...
End Sub
gitbyte 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 myjian 的回复:]
....你的上下两部分代码最好封装起来,然后从流程上分解执行.....

VB codeprivtesub timer1_timer()static Xaslongselectcase Xcase0Call Sub1()
timer1.interval=1000'1秒后执行Sub2()case1Call Sub2()
timer1.interval=3000'3秒后执行SubN()case NCall SubN()
timer1.interval=NNNN'NNNN秒后执行SubN+1() ............case XXX
X=0'这里是执行完所有流程后的重复,如果不需要重复,则直接设置定时器Enabled=False就行了 timer1.interval=1000'1秒后重复执行endselect
x=x+1end sub
个人认为,这样的话虽然代码流程不如你那种直接延时来得清晰,但是却是一种很好的结构.....
[/Quote]
老马的代码经常性更改interval 长时间运行好像会出问题。timer可能会挂掉。。我那个好像就是这样。本机没问题。移到其他机子就over掉。
我那问题还在解决。本以为是壳的问题。或者是vmp之后就挂掉。无壳也是这样。痛苦死。还在调试。在本机有事就好办。可是在其他机子出问题真不好测试。无语了。
我只做成一个过程
wait 时间
这样就可以暂停。过程里边使用sleep和doevents结合就可以不卡。并能延迟
loveme_wife 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 myjian 的回复:]
....你的上下两部分代码最好封装起来,然后从流程上分解执行.....
[/Quote]

谢谢你的思路,但实际应用中可能存在问题,因为有些延时是在循环中或其它复杂结构中
嗷嗷叫的老马 2009-10-30
  • 打赏
  • 举报
回复
....你的上下两部分代码最好封装起来,然后从流程上分解执行.....

privte sub timer1_timer()
static X as long

select case X
case 0
Call Sub1()
timer1.interval=1000 '1秒后执行Sub2()
case 1
Call Sub2()
timer1.interval=3000 '3秒后执行SubN()
case N
Call SubN()
timer1.interval=NNNN 'NNNN秒后执行SubN+1()
............
case XXX
X=0 '这里是执行完所有流程后的重复,如果不需要重复,则直接设置定时器Enabled=False就行了
timer1.interval=1000 '1秒后重复执行
end select
x=x+1
end sub

个人认为,这样的话虽然代码流程不如你那种直接延时来得清晰,但是却是一种很好的结构.....
贝隆 2009-10-30
  • 打赏
  • 举报
回复
DoEvents是将CPU的控制权返回给操作系统,操作系统会将CPU执行权限分给需要的任务,这是如果你的程序写的不严谨可能会带来错误的执行顺序,进而带来错误。建议你加强你的程序的严谨性。尤其是逻辑上的严谨性,这个比较麻烦,很费脑筋。我曾经遇到过这样的情况,费了好大的劲儿才找到问题出在DoEvents上。
  • 打赏
  • 举报
回复
blnWaiting = True ???
of123 2009-10-30
  • 打赏
  • 举报
回复

在 Timer 事件中维护一个全局变量。

运行代码在一个循环中等待此变量的某一值。

例如 Public blnWaiting As Boolean

'--------------------------
blnWaiting = True

Timer1.Enabled = True

Do Until Not blnWaiting
Doevents
Loop
......
'---------------------------

Private Sub Timer1_Timer()
blnWaiting = False
Timer1.Enabled = False
End Sub
Siramizu 2009-10-30
  • 打赏
  • 举报
回复
timer好像是属于另一个线程了吧?
luofenghen 2009-10-30
  • 打赏
  • 举报
回复
TIMER本身就可以是延时了 主要是你timer1.interval= 这个值=多少 如果是10000 则是10秒调用一次
三楼の郎 2009-10-30
  • 打赏
  • 举报
回复
不知道你代码怎么写的,延时开始的时候设置Timer.enable=false,等完了以后再设置Timer.enable=true
loveme_wife 2009-10-30
  • 打赏
  • 举报
回复
我的延时就是要在Timer里做延时的,
关键还在延时的过程中,就继续执行下面的代码了.....
luofenghen 2009-10-30
  • 打赏
  • 举报
回复
timer1.interval=text1.text
luofenghen 2009-10-30
  • 打赏
  • 举报
回复
延时最好不要用SLEEP ,他是程序运行完了再等比如10秒出结果 ,很郁闷的
用TIMER最好的

1,486

社区成员

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

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