查看: 444  |  回复: 0
  VB6 函数DoEvents和Sleep的关系
楼主
发表于 2024年3月19日 23:04

新建From1-2(窗体),新建Command1(按钮CommandButton),代码:

Private Sub Command1_Click()
    Form2.Show
    MsgBox DoEvents
End Sub

运行结果:

2

神奇不?

语法

DoEvents ( )

备注

DoEvents 函数返回一个 Integer 类型的值,表示独立版本的 Microsoft Visual Basic(如 Visual Basic、Professional Edition)中打开的窗体数。 DoEvents 在所有其他应用程序中返回零。

DoEvents 将控制传递给操作系统。 操作系统处理完其队列中的事件并发送 SendKeys 队列中的所有密钥后,将返回控件。

DoEvents 对于允许用户在进程启动后取消进程(例如搜索文件)等简单操作最有用。 对于长时间运行的进程,通过使用计时器或将任务委托给 ActiveX EXE 组件,可以更好地向处理器屈服。 在后一种情况下,任务可以完全独立于应用程序继续,操作系统负责处理多任务和时间切片。

每当在事件过程中暂时向处理器屈服时,请确保在第一次调用返回之前,不会从代码的其他部分再次执行 过程;这可能会导致不可预知的结果。 此外,如果其他应用程序可能在你产生控制权期间以不可预见的方式与过程交互,请不要使用 DoEvents 。


如果跟一下VB/VBA的DoEvents的实现,会赫然发现,这货居然在调用Sleep函数。是不是更迷糊了?Sleep不是不干事么!难道做不如不做,有理了?那以后想让代码摸鱼,岂不是越Sleep,越干得欢快?

想想,天下武功唯快不破,闪电侠跑得足够快,时间都能慢下来。如果眼皮儿眨得够快,不就相当于没有眨了嘛。但究竟眨没呢,显然是眨了的。同样,对于Sleep函数来说,Sleep 0,不就相当于没有Sleep了嘛。说好的放弃控制权呢?骗骗系统罢了。

没错,DoEvents就是通过Sleep 0来欺骗系统,它只是通知系统赶快把队列里的其他活儿排上,别误了大事儿。系统一听,好家伙,孔融让李啊,怎么忍心惩罚呢(降低优先级)。便去吼一嗓子,让队伍动一动,免得有人焦躁。哎,其他人都动了下,不卡了吧。

接着系统说,领狗粮了,下一个!那个DoEvents的家伙笑眯眯地伸出双爪,系统一看,怎么还是你?DoEvents说,为什么不是我,都是按规矩来的,赶紧!系统恨得牙痒痒,自知是生来的错,只得念念有词:下个版本,下个版本,等着啊...

您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2024 MaNongKu.com