目前我对DoEvents的全部理解是,用DoEvents可以交出系统控件权,用这句语句后一个较长时间的循环就不会看起来像是死机一样了。
但系统内部究竟是如何处理这个语句的并不太清楚。在使用中也有很多不明白的地方,比如,DoEvents是否只对循环语句有用,如果没有循环语句,DoEvents是否能用,会不会影响系统性能?另外是,用在哪里,是在每个循环前用,还是一个过程的开始用一句就可以了,还是说要重复使用?概念不清直接影响使用,还请高手多多指教。

解决方案 »

  1.   

    如果没有循环语句,DoEvents是否能用-- 是。
    还是说要重复使用 -- 是
      

  2.   

    再请教楼上两位,也就是说在同一个过程中,每个循环语句之前都要用一次DoEvents咯?
      

  3.   

    你“觉得有必要响应一下别的消息、需要‘让一下道’”的时候,就可以用一下 DoEvents 。特别是在一些比较费时的循环中,‘适当’地 DoEvents 一下,可以避免造成“程序已死”的错觉。
      

  4.   

    当然如果没有必要就别人,如果用了doevents的话,用户做其它操作也是可行的。这样一来,可能你的计算过程没有结束,用户已经做了其它操作了。可能会让你的数据出现一些很奇特的错误...
      

  5.   

    用来进行中断处理,如果为循环体写,一定要写在循序体内,起始,中间,结束前的位置没有太大影响。但有一种情况是解决不了的,就是本身一个操作响应时间很长,比如说用sql语句对一个几百万数据量的表进行查询时,查询过程中没有办法中断。
      

  6.   

    注意不是每个循环语句之前都要用一次DoEvents;
    而是每个循环之内都最好有DoEvents
      

  7.   

    用doevents就是防止大循环显示假死现象,如果放在循环体外,和没写是一样的。
      

  8.   

    lz对DoEvents的理解是错误的。
    DoEvents相当于调用了一个子程序子程序会响应当前消息队列的其余消息,然后返回。在VB处理一个耗时的事件时,可能会触发别的事件,比如用户试图移动窗口、按按钮、或者一个定时器到时了。Windows会把这些消息放入一个队列里面,但是在处理完当前事件以前,VB会对这些视而不见,结果就是用户界面假死。
    DoEvents的意思是,把新产生的事件当作当前事件DoEvents的子程序去掉用。执行完了再执行当前事件的余下部分。如同函数1调用函数2,然后返回函数1继续运行,并非函数1放弃控制权,也不是函数1函数2同时运行。
    可以看出来,DoEvents也是有局限的。
    (1)只能在两条语句之间插入,如果一条语句本身耗时,就没有办法了。
    (2)DoEvents会改变程序运行顺序,造成意想不到的问题,特别是程序中使用全局变量的时候。
    在C++里面,一般使用线程来异步执行代码,这样才能真正避免界面死锁,并且并行执行程序。