解决方案 »

  1.   

    因为 Timer 过子夜的时候,计数回 0 了。你在每一笔 Timer 增加 20 秒时都要检查是否会跨子夜。如果是,则要的 Timer 回零后,将你要达到的下一个 Timer 时减去一昼夜的秒数,否则永远不可能达到。
      

  2.   

    参考:
    Option ExplicitPrivate mlNextTime As LongPrivate Sub Form_Load()
       mlNextTime = 0
       Timer1.Interval = 1000
       Timer1.Enabled = True
    End SubPrivate Sub Timer1_Timer()
       Dim lTemp As Long
       lTemp = Timer()
       If (lTemp >= mlNextTime) Then
          Print lTemp
          mlNextTime = lTemp + 5     ' 每5秒触发
          'mlNextTime = lTemp + 20    ' 每20秒触发
          ' 判断是否“跨0时”
          If (mlNextTime >= 86400) Then mlNextTime = mlNextTime - 86400
       End If
    End Sub
      

  3.   

    吓我一跳,开始没看清以为Timer控件有这问题。
    那干脆用这个timeGetTime吧,至少还能撑二十多天吧?
    http://bbs.csdn.net/topics/390629856实在还不够就用那个QueryPerformanceCounter好了
      

  4.   

    实际上,楼主用的不是 Timer 控件。如果用 Timer 控件,根本不必考虑 Timer 函数的值,事件触发去处理就是了。Option Explicit 
    Private n As LongPrivate Sub Form_Load()    
        mlNextTime = 0    
        Timer1.Interval = 1000    
        Timer1.Enabled = True
    End SubPrivate Sub Timer1_Timer()
       n = n + 1
       If n = 20 Then
          'Do something
          n = 0
       End If
    End Sub
    楼主用的是 Timer 函数和循环操作。Dim lngNextTime As Long
    Dim blnStop As BooleanPrivate cmdRun_Click()
    blnStop = FalselngNextTime = Timer + 20
    If lngNextTime >= 86400 Then lngNextTime = lngNextTime - 86400Do Until blnStop
        DoEvents
        'Must check cross-midnight case to keep 20 seconds interval
        If ((lngNextTime <= 20) And (Timer <= 20) And (Timer >= lngNextTime)) Or
           ((lngNextTime > 20) And (Timer >= lngNextTime)) Then
            'Do something
            lngNextTime = Timer + 20
            If lngNextTime >= 86400 Then lngNextTime = lngNextTime - 86400
        End If
    Loop
    End SubPrivate Sub cmdStop_Click()
        blnStop = True
    End Sub
    实际上,楼主可以用 GetTickCount 函数来取代 Timer,从开机算起,可以持续计时 49.7 天,完全可以满足楼主的需求。需要注意的是,GetTickCount 函数返回值的单位是 ms。另外,如果采取了类似 Timer 函数跨子夜处理,用什么函数都可以无限期地进行下去。
      

  5.   

    我没说要用 Timer控件来处理楼主的问题。我的代码,关键是在处理“过夜”和“时间间隔”的方面,好不…………
      

  6.   

    要是把重心放在 Timer控件上,我还写那么多代码干吗。
    直接就说句:用Timer控件,Interval设置了20000就是了。
      

  7.   

    为什么一定要用Timer呢?用Sleep多好啊。
    用while做一个死循环,做完指定任务后暂停20000毫秒,然后从头再来。一样的效果。while(true)
      ;这里加入要做的事情。
    Sleep 20000
    Wend如果还要控制它暂停核继续的话,就在加上一个布尔开关什么的。
    或者用另一个线程去做这个循环。毕竟线程是可以随意暂停和开始的。