兄弟,doevents会将控制权传给操作系统,当操作系统处理完队列中事件,并在sendkeys队列中所有的键也都 已经发送出去后,返回控制权。 现在打个比方:假如你的代码改为 Private Sub Command2_Click() Static intClick As Integer Dim intClickNumber As Integer Dim dblEndTime As Double
intClick = intClick + 1 intClickNumber = intClick
dblEndTime = Timer + 3#
Do While dblEndTime > Timer '注意这里 Loop MsgBox "Click " & intClickNumber & " is finished" End Sub 那么在循环的时候,他会一直在空转,而且一直占用着cpu控制权,在循环还没结束时,你点击其他的按钮或做其他事情都好,应用程序都“不响应”,其实不是它不响应,而是它一直在忙着,没时间理你。这是就象死机一样拉,直到循环结束。 但是在循环中加上一个doevents就不一样了。 没循环一次,执行一次doevents,(看看有没有其他消息需要响应的,有,好的,先去响应别的事情,做好事情后,再回来继续循环),你看,这不就不会死机了吗。 但是一般最好少用doevents,有时候它会给你带来一些不可预料的问题的。
现在打个比方:假如你的代码改为
Private Sub Command2_Click()
Static intClick As Integer
Dim intClickNumber As Integer
Dim dblEndTime As Double
intClick = intClick + 1
intClickNumber = intClick
dblEndTime = Timer + 3#
Do While dblEndTime > Timer '注意这里
Loop
MsgBox "Click " & intClickNumber & " is finished"
End Sub
那么在循环的时候,他会一直在空转,而且一直占用着cpu控制权,在循环还没结束时,你点击其他的按钮或做其他事情都好,应用程序都“不响应”,其实不是它不响应,而是它一直在忙着,没时间理你。这是就象死机一样拉,直到循环结束。
但是在循环中加上一个doevents就不一样了。
没循环一次,执行一次doevents,(看看有没有其他消息需要响应的,有,好的,先去响应别的事情,做好事情后,再回来继续循环),你看,这不就不会死机了吗。
但是一般最好少用doevents,有时候它会给你带来一些不可预料的问题的。
因为这里是个循环,可能会循环很长时间,或者干脆就是一个死循环。
如果没有Doevents,程序就埋头干他的循环,好像死机的样子。
加了Doevents,每个循环中,程序都照顾一下有没有其它事件需要响应,例如你按了一个键,或者点击了“中止”按钮。只要你在相应的事件里加入了代码,这段代码就可以插在循环的代码之间运行,甚至中止循环。
DoEvents
Loop
好象是个死循环的,用来延时用的,DoEvents把控制权交给系统,以便随时执行其他事件的响应
但这用Timer控件做更好,不然用户可能会再单击Command2(谁知道他会再点几次),不小心就出大问题了。