网站首页 > 技术文章 正文
前言
无论编不编程,谁没见过电脑卡死不是。正如古人说得好,常在河边走哪有不湿鞋,谁还没有迷路找不到道的时候,是不!俗话说,浪子回头金不换,有些人给点时间,准能上岸。但电脑毕竟不是人啊,一旦卡起,不响应鼠标键盘,友谊的小船不翻也得给翻了去。
倘若不问个为什么,给了时间,可不是糟蹋电嘛。这不,《VB/VBA程序假死,长时间不响应的原因有哪些?》一出,有人不服了。
"数据量大了,啥语言都得卡死",这听上去让人觉着就该卡一样。当然也有人说,为啥不多线程?可是,也不是什么问题都可以用多线程来解决的。更何况VB/VBA里的多线程,藏的够好,一般人很难摸到窍门。
那是不是就没有办法了呢?或者说VB/VBA就没有办法了呢?那肯定不是。有网友说,用DoEvents放弃控制权不就完事了,可真的是这样吗?那本文将带各位一探DoEvents的究竟,Follow Me!
一、看看官方文档中的DoEvents
DoEvents这个函数,一般大家也找不到机会用,即便是在循环中。也只有调用那些无法控制的代码时,才有机会。比如启用另外一个EXE去执行某个任务,才会有人想用1个近乎空转的循环来等待任务的结果。为了不卡,才会想到DoEvents。
你别说,用了DoEvents,不但不卡,CPU的占用也不会飙升,堪称VB/VBA中不卡神器。但是,大家有没有想过,既然DoEvents是来放弃控制权的,CPU都不为之所用,那谁来干活呢?不干活当然就不卡嘛,这不卡,岂不是掩耳盗铃,自欺欺人嘛。还有,这种不卡,会不会进一步增加数据处理的时间呢?
二、BtOfficer眼中的DoEvents
在《VB/VBA程序假死,长时间不响应的原因有哪些?》中,给大家介绍了Windows系统CPU资源调配的原理,如果是放弃控制权,就意味着重新排队,很显然是会增加耗时的。但有心的网友,肯定会发现,使用DoEvents不但不会显著增加时耗,反而会提升效率。
这是为何呢?还得回到DoEvents的功能上来,那就是放弃控制权。只不过,此放弃非彼放弃,此放弃是为了争夺,是以退为进。
是不是很难理解?原因其实就是上图中的"Sleep一下下"啦。
三、Sleep跟DoEvents有啥关系?为何不放反争,不退反进?
如果跟一下VB/VBA的DoEvents的实现,会赫然发现,这货居然在调用Sleep函数。是不是更迷糊了?Sleep不是不干事么!难道做不如不做,有理了?那以后想让代码摸鱼,岂不是越Sleep,越干得欢快?
想想,天下武功唯快不破,闪电侠跑得足够快,时间都能慢下来。如果眼皮儿眨得够快,不就相当于没有眨了嘛。但究竟眨没呢,显然是眨了的。同样,对于Sleep函数来说,Sleep 0,不就相当于没有Sleep了嘛。说好的放弃控制权呢?骗骗系统罢了。
没错,DoEvents就是通过Sleep 0来欺骗系统,它只是通知系统赶快把队列里的其他活儿排上,别误了大事儿。系统一听,好家伙,孔融让李啊,怎么忍心惩罚呢(降低优先级)。便去吼一嗓子,让队伍动一动,免得有人焦躁。哎,其他人都动了下,不卡了吧。
接着系统说,领狗粮了,下一个!那个DoEvents的家伙笑眯眯地伸出双爪,系统一看,怎么还是你?DoEvents说,为什么不是我,都是按规矩来的,赶紧!系统恨得牙痒痒,自知是生来的错,只得念念有词:下个版本,下个版本,等着啊...
欢迎关注BtOfficer,谁说VB/VBA不能屎上雕花!
猜你喜欢
- 2025-09-09 利用shell()函数在Word中打开Excel(2)
- 2025-09-09 PLC编程经验总结,事半功倍_plc编程入门及工程实例
- 2025-09-09 你知道《三国杀》于吉技能怎么用吗
- 2025-09-09 值得推荐的10家医疗健康初创公司_健康医疗企业
- 2025-09-09 VBA信息获取与处理专题五第二节:根据地址不同分发简单邮件
- 2025-09-09 手机云台稳定器 让你秒变专业摄影师
- 2025-09-09 3张表带你认识图纸上的常用符号,再也不用担心符号看不懂了
- 2025-06-30 手机云台稳定器 让你秒变专业摄影师
- 2025-06-30 二极管基础知识(2)二极管的关键参数
- 2025-06-30 [西门子PLC]S7-200SMART定位控制中延时问题的编程技巧
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)