求教一个关于VB的问题(为什么程序不按顺序运行?!)

来源:百度知道 编辑:UC知道 时间:2024/05/04 18:52:14
在Form1的Load事件下输入以下代码:

Private Sub Form_Click()
Print "begin"
For a = 1 To 10000
For b = 1 To 1000
c = c + 1 '没有什么实际意义,只是用来确定正在执行循环
Next b
Next a
Print "end"
End Sub

我本以为会先输出“begin",然后过一段时间(用来执行循环)后再输出"end".不过程序的实际运行结果是先执行循环,然后再同时输出begin和end。请问这是为什么?难道是编译软件进行优化时把顺序调整了吗?
如果我想实现先输出“begin",然后执行循环,再输出"end"应该怎样编程?

那只是假象:程序确实是按照你写的顺序运行的,如果你不相信,不妨在 c = c + 1那一行下面加一句 print c ,但一定注意把循环次数改小,要是还用10000和1000会死掉,你会看到确实第一行print出来的是begin,然后才是一列c的变量值,最后是end。

为什么会这样呢:因为VB内部的运算速度很快,在接到Print "begin" 语句后,程序将要把begin字符串print到窗体上时,由于外部显示的原理限制(就是显示一下要刷新一下窗体),还没等到刷新指令的执行完毕,也就是你还没看到begin字符串,程序内部就开始了下面的循环,把运算资源都拉到循环语句那去了,导致循环完毕后才有资源显示begin,并导致了你看到先循环完,再begin和end前后脚被print的假象。

楼上朋友说的加DoEvents的方法,其作用是向程序内部发送一个后台的空指令,即延缓下面语句(下一个循环)的到来,是系统能够先利用资源把begin显示出来,而避免资源被循环全部占用。

你在c=c+1前面加一行,写上DoEvents,再试试。

c = c + 1 后面加入DoEvents
是因为你的过程执行的,只有等代码执行完后,才能刷新窗口,因此感觉上是同时输出begin和end

DoEvents是把执行权交出一段时间,比如交给窗口刷新句柄