比如你做一个查询,把查询结果一条一条的写入表格中,如果你没有Doevents这个语句,那么你知道VB会是单线程的执行,没有把所有数据写到表格中,程序是不会终止的,而这段时间里你也做不了别的事情,比如你点击其它的按钮,但是系统是不会响应的,可是如果你在刚才的写表格的循环过程中加入Doevents这句话,那么你点击其它的按钮,系统会给你响应,就是说你点击的其它按钮中的事件会被执行,然后再继续执行刚才说到的循环过程。

解决方案 »

  1.   

    给系统一个响应其它请求的机会,不然如果你的程序太占用CPU,用户想结束程序都点不住取消按钮
      

  2.   

    Private Sub Command1_Click()   '过程的所有实例都
       '共享静态变量。
       Static blnProcessing As Boolean
       Dim lngCt As Long
       Dim intYieldCt As Integer
       Dim dblDummy As Double
       '按下按钮时,检测是否
       '已经在处理。
       If blnProcessing Then
          '如果正在处理,则取消处理。
          blnProcessing = False
       Else
          Command1.Caption = "NO"
          blnProcessing = True
          lngCt = 0
          '执行一百万次浮点
          '乘法计算。每一千次后,
          '检测是否要取消。
          Do While blnProcessing And (lngCt < 1000000)
             For intYieldCt = 1 To 1000
                lngCt = lngCt + 1
                dblDummy = lngCt * 3.14159
             Next intYieldCt
             'DoEvents 语句允许其它事件
             '发生,包括第二次
             '按此按钮。
             DoEvents
          Loop
          blnProcessing = False
          Command1.Caption = "OK"
          MsgBox lngCt & " multiplications were performed"
       End If
      

  3.   

    这样说吧,你学过汇编语言或是计算机组成原理吗?!!它就好像计算机中的硬件中断一样…!!!让别的程序有机会得到CPU的响应…!!!
      

  4.   


    DoEvents 函数
          转让控制权,以便让操作系统处理其它的事件。语法DoEvents( )说明DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中打开的窗体数目,例如,Visual Basic,专业版,在其它的应用程序中,DoEvents 返回 0。DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys 队列中的所有键也都已送出之后,返回控制权。DoEvents 对于简化诸如允许用户取消一个已启动的过程 — 例如搜寻一个文件 — 特别有用。对于长时间过程,放弃控制权最好使用定时器或通过委派任务给 ActiveX EXE 部件来完成。以后,任务还是完全独立于应用程序,多任务及时间片由操作系统来处理。小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。