VB中延时CPU老是到100%有办法解决吗?
下面是函数Public Declare Function GetTickCount Lib "kernel32" () As LongPublic Function My_Delay(sSeconds As Long)   '延时函数 Delay(毫秒)
    
   Dim Begin As Long
     Begin = GetTickCount
     Do: DoEvents
     Loop Until GetTickCount - Begin > sSeconds
End Function我的软件是会一直向数据库中请求数据,直到拿到数据结束。我是设的每1秒向数据库中查询。发现上面这个函数占用CPU很高。有办法解决吗?或者替代办法。谢谢。

解决方案 »

  1.   

    应该不是这段代码占用你的CPU吧,而是你那读取数据的语句占用了大量的CPU
      

  2.   

    我确定过了是这段代码。我把这段代码单独用EXE来执行CPU一直很高
    可以肯定是这段代码
      

  3.   

    确实占用CPU
    这是毫米级的延时
    计时时间长的话尽量不要这么用
    可以这样使用:
    Private Sub waittime(delay As Single)
        Dim starttime As Single
        starttime = Timer
        Do Until (Timer - starttime) > delay
        Loop
    End Sub
      

  4.   

    楼上的朋友,我刚试了一下你的代码。占用CPU比我的更厉害。
    还有别的办法吗
      

  5.   

    用Timer记数
    Do-Loop循环怎么做都占
      

  6.   

    这段代码的确会占用CPU利用率100%,这是循环的原因问题在于他会在操作系统有其它的CPU请求时释放一定的CPU资源给请求,所以100%的CPU利用率并没有关系。
      

  7.   

    在计算机延迟时间,可以用1,定时器,2程序循环。
    泰山的意思是你用timer控件,LZ用的是程序循环
    程序循环嘛,当然就是不停的取时间,比较,取时间,比较,占用100%cpu那是当然了。
    用timer控件,
    sub a1()
    timer1时间间隔1秒
    timer1允许
    end sub
    sub timer1_timer()
    timer1禁止
    调用延迟后需要允许的程序
    end sub
      

  8.   

    如果想解决这个问题(不过,我认为没有必要)
    可以使用Sleep来解决Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)该函数的意思是让当前进程挂起指定时间,此时被挂起的进程是不占用CPU资源的,但它会导致被挂起的进程假死。所以不能挂起太长时间可以把你的延迟程序修改为:Do
        Sleep 50
        DoEvents
    Loop until Gettickcount-lngStart >lngDelay
      

  9.   

    系统的sleep也会很卡的,do loop结合doevents用的话还好吧,不会使得前台操作变卡。
    下面的这个函数和你的类似,比较看看:
    Private Declare Function timeGetTime Lib "winmm.dll" () As Long'单位为毫秒
    Public Sub Delay(ByVal MS As Long)
    Dim T As Long
    T = timeGetTime
    While timeGetTime - T < MS
    DoEvents
    Wend
    End Sub下面再提供一个延时类,用起来好像还行,强烈推荐:
    http://download.csdn.net/source/752060
      

  10.   

    本帖最后由 bcrun 于 2011-03-15 11:20:52 编辑
      

  11.   

    使用GetTickCount长时间运行时会出问题。Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
    Private Type SYSTEMTIME
            wYear As Integer
            wMonth As Integer
            wDayOfWeek As Integer
            wDay As Integer
            wHour As Integer
            wMinute As Integer
            wSecond As Integer
            wMilliseconds As Integer
    End Type
      
    Private Function GetTickCountEx() As Currency
        Dim stTime As SYSTEMTIME
           
        GetSystemTime stTime
        GetTickCountEx = DateDiff("d", "1900-01-01", stTime.wYear & "-" & stTime.wMonth & "-" & stTime.wDay) * 8640000@ + stTime.wHour * 360000@ + stTime.wMinute * 60000@ + stTime.wSecond * 1000@ + stTime.wMilliseconds
    End FunctionPublic Sub Delay(wMilliseconds As Long)
        Dim cyStartTime As Currency
        
        cyStartTime = GetTickCountEx
        Do While (GetTickCountEx() - cyStartTime) < wMilliseconds
            DoEvents
            Sleep 1
        Loop
        
    End SubSub main()
        Debug.Print Timer
        Delay 5000 '延时5秒,基本上不占CPU
        Debug.Print Timer
    End Sub
      

  12.   

    你看看数据库的那个进程是不是占用cpu/内存很大 ?
      

  13.   

    在你的循环体内加一句sleep 1即可.
      

  14.   

    每秒1次的频度用 Timer 控件足矣。
    只需要程序结构上稍做调整,原先循环中的查询改为在 Timer 事件中调用。
      

  15.   

    http://download.csdn.net/source/752060
    试试上面这个类的方法,我测试了下发现cpu变化不明显。
      

  16.   

    最好的办法就是在循环中加上Sleep
    至于sleep多少,可以根据调试情况而定。
      

  17.   

    http://topic.csdn.net/u/20091016/17/e3c0adf9-1373-45dc-8a73-1faa41b5ea70.html
      

  18.   

    用Sleep就可以了
    我以前遇到过同样的问题
    加了Sleep(1)直接从100%下降到0%
      

  19.   

    本帖最后由 bcrun 于 2011-03-27 21:17:27 编辑