在1个要处理2000-3000个文件比较大的循环过程里
原来是在每个文件处理完成后DoEvents 那时Cpu会占用100%
改为DoEvents:Sleep 1后 ,
Cpu 占用大幅下降了,但是处理速度也大幅下降了,不用计算,单从进度条上看,就损失了远远不止原来1毫秒的处理进度!感觉象 Sleep 1 是每分配给进程1毫秒就Sleep 1毫秒.
为什么Sleep 1会使速度下降那么多呢?
有什么办法能既解决Cpu占用100%的问题,又有较快的处理速度呢?

解决方案 »

  1.   

    应该在每个文件处理过程中使用DoEvents解决
      

  2.   

    'Doevents确实会影响效率的,用下面的两个方法试一下Public Declare Function GetInputState Lib "user32" () As Long Public Sub newDoEvents() '这个是比较简单,功能较少
            If GetInputState() <> 0 then DoEvents 
    End Sub '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    Public Const QS_HOTKEY = &H80 
    Public Const QS_KEY = &H1 
    Public Const QS_MOUSEBUTTON = &H4 
    Public Const QS_MOUSEMOVE = &H2 
    Public Const QS_PAINT = &H20 
    Public Const QS_POSTMESSAGE = &H8 
    Public Const QS_SENDMESSAGE = &H40 
    Public Const QS_TIMER = &H10 
    Public Const QS_ALLINPUT = (QS_SENDMESSAGE Or QS_PAINT Or QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON Or QS_MOUSEMOVE Or QS_HOTKEY Or QS_KEY) 
    Public Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON) 
    Public Const QS_INPUT = (QS_MOUSE Or QS_KEY) 
    Public Const QS_ALLEVENTS = (QS_INPUT Or QS_POSTMESSAGE Or QS_TIMER Or QS_PAINT Or QS_HOTKEY) 
    Public Declare Function GetQueueStatus Lib "user32" (ByVal qsFlags As Long) As LongPublic Function cGetInputState() '这个可以按自己的要求定义,接收到什么消息才DoEvents 
        Dim qsRet As Long 
        qsRet = GetQueueStatus(QS_HOTKEY Or QS_KEY Or QS_MOUSEBUTTON Or QS_PAINT) 
        if qsRet<>0 then DoEvents 
    End Function 
    '有了上面2个函数就不怕影响循环中的运算效率了
      

  3.   

    SLEEP使用时系统停顿,不作其它事,应该单用DoEvents