前言

前言

这是电脑程序没排上回家的队,迷路了
打开网易新闻 查看精彩图片
这是电脑程序没排上回家的队,迷路了

无论编不编程,谁没见过电脑卡死不是。正如古人说的好,常在河边走哪有不湿鞋,谁还没有迷路找不到道的时候,是不!俗话说,浪子回头金不换,有些人给点时间,准能上岸。但电脑毕竟不是人啊,一旦卡起,不响应鼠标键盘,友谊的小船不翻也得给翻了去。

倘若不问个为什么,给了时间,可不是糟蹋电嘛。这不,《VB/VBA程序假死,长时间不响应的原因有哪些?》一出,有人不服了。

"数据量大了,啥语言都得卡死",这听上去让人觉着就该卡一样。当然也有人说,为啥不多线程?可是,也不是什么问题都可以用多线程来解决的。更何况VB/VBA里的多线程,藏的够好,一般人很难摸到窍门。

那是不是就没有办法了呢?或者说VB/VBA就没有办法了呢?那肯定不是。有网友说,用DoEvents放弃控制权不就完事了,可真的是这样吗?那本文将带各位一探DoEvents的究竟,Follow Me!

一、看看官方文档中的DoEvents

一、看看官方文档中的DoEvents

还别说,就是放弃控制权!网友胜!
打开网易新闻 查看精彩图片
还别说,就是放弃控制权!网友胜!

DoEvents这个函数,一般大家也找不到机会用,即便是在循环中。也只有调用那些无法控制的代码时,才有机会。比如启用另外一个EXE去执行某个任务,才会有人想用1个近乎空转的循环来等待任务的结果。为了不卡,才会想到DoEvents。

你别说,用了DoEvents,不但不卡,CPU的占用也不会飙升,堪称VB/VBA中不卡神器。但是,大家有没有想过,既然DoEvents是来放弃控制权的,CPU都不为之所用,那谁来干活呢?不干活当然就不卡嘛,这不卡,岂不是掩耳盗铃,自欺欺人嘛。还有,这种不卡,会不会进一步增加数据处理的时间呢?

二、BtOfficer眼中的DoEvents

二、BtOfficer眼中的DoEvents

谁说是放弃控制权的,明明是争夺好不?
打开网易新闻 查看精彩图片
谁说是放弃控制权的,明明是争夺好不?

在《VB/VBA程序假死,长时间不响应的原因有哪些?》中,给大家介绍了Windows系统CPU资源调配的原理,如果是放弃控制权,就意味着重新排队,很显然是会增加耗时的。但有心的网友,肯定会发现,使用DoEvents不但不会显著增加时耗,反而会提升效率。

这是为何呢?还得回到DoEvents的功能上来,那就是放弃控制权。只不过,此放弃非彼放弃,此放弃是为了争夺,是以退为进。

是不是很难理解?原因其实就是上图中的"Sleep了一下下"啦。

三、Sleep跟DoEvents有啥关系?为何不放反争,不退反进?

三、Sleep跟DoEvents有啥关系?为何不放反争,不退反进?

Sleep,做,不如不做...
打开网易新闻 查看精彩图片
Sleep,做,不如不做...

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

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

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

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

欢迎关注BtOfficer,谁说VB/VBA不能屎上雕花!

打开网易新闻 查看精彩图片