iamplayboy 发表于 2011-4-7 07:38:18

VB与CPU利用率联系小的延迟函数

额..我用VB做挂  感觉挂一个两个的时候还没多大事 但是七八开以后CPU利用率接近100%
此时延迟函数已经十分不准确 本来延迟100MS的需要数秒才能完成
以下是本人的函数
Public Sub delay(mtime As Long)
Dim i As Integer
    For i = 1 To mtime
    DoEvents
    Sleep (1)
    Next
End Sub

求一个不要求特精密但是能不依靠于CPU的延迟函数
PS.我朋友有个挂即使在100%的情况下依旧超快.好羡慕..

sherwood5 发表于 2011-4-7 07:38:32

delphi

建个线程,不要用Timer
线程里直接sleep(1000)
这样就不会影响主线程了

df001 发表于 2011-4-7 07:38:58

不用延时啊。直接开线程。在线程里爱怎么sleep就怎么sleep。跟cpu没关系的。
打个比方
4个线程在同时瞬间执行了4*3*1000次的读内存。cpu不会到2%,时间不会肉眼可以察觉。

zjh7272 发表于 2011-4-7 07:39:06

其实咱们写那点小挂根本都用不了多少cpu的。如果占用很高一定是代码的问题。
说的人家开发cpu的就叫咱这么折腾了折腾就快趴下了还混什么

feiyang025 发表于 2011-4-7 07:39:49

Public Sub delay(mtime As Long)
Dim i As Integer
    For i = 1 To mtime
    DoEvents
    Sleep (1)
    Next
End Sub
这段cpu占用率太高。。。
不如得到两个时间差来做延时

sghfxp 发表于 2011-4-7 07:39:56

占用CPU100%的情况是因为你的程序在一直使用着CPU的资源所造成的,
如上面所说的用线程,在线程中使用sleep,
sleep的功能是让当前线程自动放弃CPU时间片,留给其它的线程使用

zhangjian950617 发表于 2011-4-7 07:40:05

PrivateDeclareFunctionGetTickCountLib"kernel32"Alias"GetTickCount"()AsLong   
   
PrivateSubPause(ByvalsSecAsLong)   
          DimStartSecAsLong   
          StartSec=GetTickCount()   
          While(GetTickCount()-StartSec)/1000<sSec   
            DoEvents   
          Wend   
EndSub   
   
调用Pause(1)即可暂停一秒。

aiai101 发表于 2011-4-7 07:40:44

你们有个误区的,Sleep就是让系统挂起的,但是你只挂起1ms,而循环就是让系统忙起来的,这是矛盾的。你可以有两种方式:
第一,VB的Timer或者TimerAPI,然后利用系统时间比较法,这样做可以精确到秒,并且很容易实现长时间的比较0-24小时,单位秒。
第二,在循环中使用Sleep(100)而不是Sleep(1)可以显著改善Cpu占用率。

liuyh7788 发表于 2012-10-29 10:12:04

内容娘希匹!树清无能,丧权辱国!!!
页: [1]
查看完整版本: VB与CPU利用率联系小的延迟函数