Timer函数过夜的一些问题!
手上有段代码,使用Timer函数每隔20秒记录一个数据。需要连续记录2天。
但是每次经过半夜0点的时候,Timer函数就会清0,然后程序就停止了。
不知道有没有人能给我个简单的代码例子能够解决这样的问题。 求助 因为 Timer 过子夜的时候,计数回 0 了。你在每一笔 Timer 增加 20 秒时都要检查是否会跨子夜。如果是,则要的 Timer 回零后,将你要达到的下一个 Timer 时减去一昼夜的秒数,否则永远不可能达到。
能否告知具体怎么写吗? 你原来怎么写的?
能否给个简单的例子? 参考:
Option Explicit吓我一跳,开始没看清以为Timer控件有这问题。
Private mlNextTime As Long
Private Sub Form_Load()
mlNextTime = 0
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub
Private 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
那干脆用这个timeGetTime吧,至少还能撑二十多天吧?
http://bbs.csdn.net/topics/390629856
实在还不够就用那个QueryPerformanceCounter好了
按我5F的方法进行处理,用到电脑报废都没问题。
实际上,楼主用的不是 Timer 控件。如果用 Timer 控件,根本不必考虑 Timer 函数的值,事件触发去处理就是了。
楼主用的是 Timer 函数和循环操作。
Option Explicit
Private n As Long
Private Sub Form_Load()
mlNextTime = 0
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
n = n + 1
If n = 20 Then
'Do something
n = 0
End If
End Sub
实际上,楼主可以用 GetTickCount 函数来取代 Timer,从开机算起,可以持续计时 49.7 天,完全可以满足楼主的需求。需要注意的是,GetTickCount 函数返回值的单位是 ms。
Dim lngNextTime As Long
Dim blnStop As Boolean
Private cmdRun_Click()
blnStop = False
lngNextTime = Timer + 20
If lngNextTime >= 86400 Then lngNextTime = lngNextTime - 86400
Do 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 Sub
Private Sub cmdStop_Click()
blnStop = True
End Sub
另外,如果采取了类似 Timer 函数跨子夜处理,用什么函数都可以无限期地进行下去。 我没说要用 Timer控件来处理楼主的问题。
我的代码,关键是在处理“过夜”和“时间间隔”的方面,好不…………
要是把重心放在 Timer控件上,我还写那么多代码干吗。
直接就说句:用Timer控件,Interval设置了20000就是了。
为什么一定要用Timer呢?用Sleep多好啊。
用while做一个死循环,做完指定任务后暂停20000毫秒,然后从头再来。一样的效果。
while(true)
;这里加入要做的事情。
Sleep 20000
Wend
如果还要控制它暂停核继续的话,就在加上一个布尔开关什么的。
或者用另一个线程去做这个循环。毕竟线程是可以随意暂停和开始的。
补充:VB , VBA