群聊精华

vb6不阻塞的延迟方法

DoEvents不应该和Sleep、WaitForXXX配合使用,而是跟 WaitMessage、MsgWaitForXXX 配合使用(这类阻塞函数会在有消息来时自动唤醒,保证你能及时执行 DoEvents)。

【VB1】A 17:53:24
WinAPI啊,跟语言有啥关系?
【VB4】B 17:53:33
DoEvents不是就地开个消息循环 把消息泵吃完了再退出嘛

【VB1】A 17:53:24
循环PeekMessage并处理掉
Sleep、WaitForXXX 是kernel32.dll 的等待函数
WaitMessage、MsgWaitForXXX 是user32.dll等待函数

【VB4】B17:54:44
WaitMessage应该是等了个内部信号量吧
【VB1】A 17:55:46
是啊,但这个user32.dll的内部信号量你自己又拿不到,所以只有调用user32.dll的等待函数才行实现及时响应消息。
【VB1】C 17:56:13
我也记不太清了,以前跟运行时的时候,VB/VBA的doevent里面好像是会调Sleep函数,还有一堆其他东西
【VB1】A 17:56:27
用kernel32的Sleep、WaitForXXX+DoEvents的话,消息响应始终都会有延迟。
【VB1】A 17:57:06
没什么不一样 为啥要Sleep啊。。。
不等待的话烧CPU啊
【VB4】B 17:57:19
靠 烧CPU。。。
【VB4】B 17:57:23
自旋锁吗
【VB4】B 17:57:37
CPU不就是用来用的 闲着干啥
【VB1】A 17:57:55
拿来用,不是拿来空转的。
【VB4】B 17:58:20
怕空转不应该直接用多媒体定时器嘛
【VB1】A 17:58:55
有很多时候需要用WaitForXXX等待某个系统对象的事件,你怎么用多媒体定时器?
【VB4】B 17:59:36
等待事件的时候不是就让出时间片了嘛
【VB4】B 17:59:41
sleep一下岂不是画蛇添足?
【VB1】A 17:59:56
直接WaitForXXX会卡窗口,所以最好的是DoEvents+MsgWaitForXXX。
【VB1】A 18:00:18
胎神,卡界面啊。
【VB4】B 18:00:28
(俺C#有子线程
【VB1】C 18:00:28
这个的确
【VB4】B 18:00:34
等事件肯定在子线程等
【VB4】B 18:00:45
用TaskRun转成异步
【VB1】A 18:00:56
没什么不一样 sleep一下岂不是画蛇添足?
Sleep和WaitForXXX是同一类(我只是一起说出来而已)
【VB4】B 18:01:14
这个确实
【VB1】A 18:01:15
没什么不一样 等事件肯定在子线程等
VB6不行
【VB4】B 18:01:19
和DoEvents不是一回事
【VB4】B 18:01:47

【VB4】B 18:01:51
这是winform的DoEvents实现
【VB4】B 18:01:52
简单粗暴

Views: 88

Hi, I’m 邓伟

本来无一物,何处惹尘埃

发表回复