网站首页 > 技术文章 正文
前言
无论编不编程,谁没见过电脑卡死不是。正如古人说得好,常在河边走哪有不湿鞋,谁还没有迷路找不到道的时候,是不!俗话说,浪子回头金不换,有些人给点时间,准能上岸。但电脑毕竟不是人啊,一旦卡起,不响应鼠标键盘,友谊的小船不翻也得给翻了去。
倘若不问个为什么,给了时间,可不是糟蹋电嘛。这不,《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-06-30 手机云台稳定器 让你秒变专业摄影师
- 2025-06-30 二极管基础知识(2)二极管的关键参数
- 2025-06-30 [西门子PLC]S7-200SMART定位控制中延时问题的编程技巧
- 2025-06-30 Excel常用技能分享与探讨(5-宏与VBA简介 VBA之用户窗体-高级用法)
- 2025-06-30 百年前的步兵神器,VB枪榴弹发射器历史以及原理解析
- 2025-06-30 WORD中打开EXCEL文件(word里面打开excel文件)
- 2025-06-30 利用单步运行及断点设置来调试程序
- 2025-06-30 开春就要上颗黄金U!酷睿i7 9700KF配置推荐
- 2025-06-30 抗晃电模块的接线及应用(防晃电模块工作原理接线图)
- 2025-06-30 PLC基础知识57问,工控人常见问题集合
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 505℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 484℃MySQL service启动脚本浅析(r12笔记第59天)
- 465℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 462℃启用MySQL查询缓存(mysql8.0查询缓存)
- 442℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 422℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 418℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)