sleep的延时将全部程序都挂起了, 在VB6这个函数还把其他可能在运行中的sub也一起停掉了~timegettime不会挂起程序而且非常精确, 延时的时候, 其他代码还可以运行, 但是缺点也很明显, 就是CPU占用太高~
我在VB6使用了timer函数, (Timer函数不是很精确计算时间但是CPU占用率很低~)timer里面需要延时200毫秒和5000毫秒, 延时期间还有其他sub或者function在运行, 所以不能使用sleep函数我使用了timegettime函数但是CPU占用率太高了~
请教各位老师, timer里面需要延时又不能使用sleep, 有什么方法可以延时但是CPU占用率相对较低呢?

解决方案 »

  1.   

    把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 
      

  2.   

    方法很简单
    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.可以结贴了
      

  3.   

    这个方法好, 有点像中断挂起. 局限性在于只能在自己纯代码的过程中实现, 要是中间调用到第三方的功能就无以为继了. 
    另外就是VB的定时器实在是很弱鸡,不够准确, 还容易被高CPU的操作耽误.
      

  4.   

    这个方法好, 有点像中断挂起. 局限性在于只能在自己纯代码的过程中实现, 要是中间调用到第三方的功能就无以为继了. 
    另外就是VB的定时器实在是很弱鸡,不够准确, 还容易被高CPU的操作耽误.
    我觉得有点像异步回调,
    但是有的时候运行状态不好保存啊,
    又是一大堆代码.还要保证运行环境不变.
    一行sleep有时候得用几百行来替代.
      

  5.   

    仅供参考:
    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
      

  6.   

    这个方法好, 有点像中断挂起. 局限性在于只能在自己纯代码的过程中实现, 要是中间调用到第三方的功能就无以为继了. 
    另外就是VB的定时器实在是很弱鸡,不够准确, 还容易被高CPU的操作耽误.
    我觉得有点像异步回调,
    但是有的时候运行状态不好保存啊,
    又是一大堆代码.还要保证运行环境不变.
    一行sleep有时候得用几百行来替代.
    是啊, 所以说有很多局限性, 毕竟VB不支持多线程. 你得像以前DOS下面编程那样去考虑这个问题(当然,没那么夸张)