目前我对DoEvents的全部理解是,用DoEvents可以交出系统控件权,用这句语句后一个较长时间的循环就不会看起来像是死机一样了。
但系统内部究竟是如何处理这个语句的并不太清楚。在使用中也有很多不明白的地方,比如,DoEvents是否只对循环语句有用,如果没有循环语句,DoEvents是否能用,会不会影响系统性能?另外是,用在哪里,是在每个循环前用,还是一个过程的开始用一句就可以了,还是说要重复使用?概念不清直接影响使用,还请高手多多指教。
但系统内部究竟是如何处理这个语句的并不太清楚。在使用中也有很多不明白的地方,比如,DoEvents是否只对循环语句有用,如果没有循环语句,DoEvents是否能用,会不会影响系统性能?另外是,用在哪里,是在每个循环前用,还是一个过程的开始用一句就可以了,还是说要重复使用?概念不清直接影响使用,还请高手多多指教。
还是说要重复使用 -- 是
而是每个循环之内都最好有DoEvents
DoEvents相当于调用了一个子程序子程序会响应当前消息队列的其余消息,然后返回。在VB处理一个耗时的事件时,可能会触发别的事件,比如用户试图移动窗口、按按钮、或者一个定时器到时了。Windows会把这些消息放入一个队列里面,但是在处理完当前事件以前,VB会对这些视而不见,结果就是用户界面假死。
DoEvents的意思是,把新产生的事件当作当前事件DoEvents的子程序去掉用。执行完了再执行当前事件的余下部分。如同函数1调用函数2,然后返回函数1继续运行,并非函数1放弃控制权,也不是函数1函数2同时运行。
可以看出来,DoEvents也是有局限的。
(1)只能在两条语句之间插入,如果一条语句本身耗时,就没有办法了。
(2)DoEvents会改变程序运行顺序,造成意想不到的问题,特别是程序中使用全局变量的时候。
在C++里面,一般使用线程来异步执行代码,这样才能真正避免界面死锁,并且并行执行程序。