【请问各位老师程序延时除了sleep和timegettime外还有更好的吗??】

KissVeggieg 2015-12-25 11:08:38

sleep的延时将全部程序都挂起了, 在VB6这个函数还把其他可能在运行中的sub也一起停掉了~

timegettime不会挂起程序而且非常精确, 延时的时候, 其他代码还可以运行,

但是缺点也很明显, 就是CPU占用太高~


我在VB6使用了timer函数, (Timer函数不是很精确计算时间但是CPU占用率很低~)

timer里面需要延时200毫秒和5000毫秒, 延时期间还有其他sub或者function在运行, 所以不能使用sleep函数

我使用了timegettime函数但是CPU占用率太高了~


请教各位老师, timer里面需要延时又不能使用sleep, 有什么方法可以延时但是CPU占用率相对较低呢?
...全文
1175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊孩子开学喽 2016-01-14
  • 打赏
  • 举报
回复
引用 5 楼 aspower_ 的回复:
[quote=引用 4 楼 WallesCai 的回复:] [quote=引用 1 楼 Tiger_Zhao 的回复:] 不要在函数内傻等延时,而是应该把运行状态保存下来,直接结束函数。 然后开启一个定时器,到时间再次调用这个函数,函数从上次的状态继续向下执行。
这个方法好, 有点像中断挂起. 局限性在于只能在自己纯代码的过程中实现, 要是中间调用到第三方的功能就无以为继了. 另外就是VB的定时器实在是很弱鸡,不够准确, 还容易被高CPU的操作耽误.[/quote] 我觉得有点像异步回调, 但是有的时候运行状态不好保存啊, 又是一大堆代码.还要保证运行环境不变. 一行sleep有时候得用几百行来替代.[/quote] 是啊, 所以说有很多局限性, 毕竟VB不支持多线程. 你得像以前DOS下面编程那样去考虑这个问题(当然,没那么夸张)
赵4老师 2016-01-14
  • 打赏
  • 举报
回复
仅供参考:

Begin VB.Form MainForm
   Begin VB.Timer TimerTest
      Enabled         =   -1   'True
      Interval        =   1000
      Left            =   0
      Top             =   0
   End
   Begin VB.Timer TimerSleep
      Enabled         =   0   'False
      Left            =   0
      Top             =   0
   End
End
Dim done1 As Boolean
Sub sleep1(ms)
    done1 = False
    TimerSleep.Interval = ms
    TimerSleep.Enabled = True
    Do
        DoEvents
    Loop Until done1
End Sub
Private Sub TimerSleep_Timer()
    TimerSleep.Interval = 0
    TimerSleep.Enabled = False
    done1 = True
End Sub
Private Sub TimerTest_Timer()
   Debug.Print "Test1"
   sleep1 400 
   Debug.Print "Test2"
   sleep1 800 
   Debug.Print "Test3"
End Sub
一笑拔剑 2016-01-13
  • 打赏
  • 举报
回复
引用 4 楼 WallesCai 的回复:
[quote=引用 1 楼 Tiger_Zhao 的回复:] 不要在函数内傻等延时,而是应该把运行状态保存下来,直接结束函数。 然后开启一个定时器,到时间再次调用这个函数,函数从上次的状态继续向下执行。
这个方法好, 有点像中断挂起. 局限性在于只能在自己纯代码的过程中实现, 要是中间调用到第三方的功能就无以为继了. 另外就是VB的定时器实在是很弱鸡,不够准确, 还容易被高CPU的操作耽误.[/quote] 我觉得有点像异步回调, 但是有的时候运行状态不好保存啊, 又是一大堆代码.还要保证运行环境不变. 一行sleep有时候得用几百行来替代.
熊孩子开学喽 2016-01-13
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
不要在函数内傻等延时,而是应该把运行状态保存下来,直接结束函数。 然后开启一个定时器,到时间再次调用这个函数,函数从上次的状态继续向下执行。
这个方法好, 有点像中断挂起. 局限性在于只能在自己纯代码的过程中实现, 要是中间调用到第三方的功能就无以为继了. 另外就是VB的定时器实在是很弱鸡,不够准确, 还容易被高CPU的操作耽误.
一笑拔剑 2016-01-13
  • 打赏
  • 举报
回复
方法很简单 timegettime+sleep 代码

Public Function delay(T As Long)
    Dim Savetime As Long
    Savetime = timeGetTime  '记下开始时的时间
    While timeGetTime < Savetime + T '循环等待
        Sleep (10)
        DoEvents '转让控制权
    Wend
End Function
timegettime cpu占用高的原因是他不停的在循环 sleep卡的原因是他不响应ui 结合起来就好了 这里sleep()里最好小于200,大于这个数还是会有点卡顿 最小可以为1,但是一般没必要,实际精度达不到1ms. 可以结贴了
Tiger_Zhao 2015-12-25
  • 打赏
  • 举报
回复
不要在函数内傻等延时,而是应该把运行状态保存下来,直接结束函数。
然后开启一个定时器,到时间再次调用这个函数,函数从上次的状态继续向下执行。
笨狗先飞 2015-12-25
  • 打赏
  • 举报
回复
把Timer时间间隔调小比如 private sub timer1_timer() static c as long c=(c+1) mod 10 select case c case 1 ... case 5 ... case 8 ... end select end sub

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧