看流星社区

 找回密码
 注册账号
查看: 4040|回复: 8

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

[复制链接]

该用户从未签到

发表于 2011-4-7 07:38:18 | 显示全部楼层 |阅读模式
额..我用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%的情况下依旧超快.好羡慕..

该用户从未签到

发表于 2011-4-7 07:38:32 | 显示全部楼层
delphi

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

该用户从未签到

发表于 2011-4-7 07:38:58 | 显示全部楼层
不用延时啊。直接开线程。在线程里爱怎么sleep就怎么sleep。跟cpu没关系的。
打个比方
4个线程在同时瞬间执行了4*3*1000次的读内存。cpu不会到2%,时间不会肉眼可以察觉。

该用户从未签到

发表于 2011-4-7 07:39:06 | 显示全部楼层
其实咱们写那点小挂根本都用不了多少cpu的。如果占用很高一定是代码的问题。
说的人家开发cpu的就叫咱这么折腾了折腾就快趴下了还混什么

该用户从未签到

发表于 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占用率太高。。。
不如得到两个时间差来做延时

该用户从未签到

发表于 2011-4-7 07:39:56 | 显示全部楼层
占用CPU100%的情况是因为你的程序在一直使用着CPU的资源所造成的,
如上面所说的用线程,在线程中使用sleep,
sleep的功能是让当前线程自动放弃CPU时间片,留给其它的线程使用

该用户从未签到

发表于 2011-4-7 07:40:05 | 显示全部楼层
Private  Declare  Function  GetTickCount  Lib  "kernel32"  Alias  "GetTickCount"  ()  As  Long   
     
  Private  Sub  Pause(Byval  sSec  As  Long)   
          Dim  StartSec  As  Long   
          StartSec  =  GetTickCount()   
          While  (GetTickCount()  -  StartSec)  /  1000  <  sSec   
              DoEvents   
          Wend   
  End  Sub   
     
  调用  Pause(1)  即可暂停一秒。

该用户从未签到

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

该用户从未签到

发表于 2012-10-29 10:12:04 | 显示全部楼层
内容娘希匹!树清无能,丧权辱国!!!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 21:48

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表