25天后通过VBA中的长期变量,环形计数器技术使计时器溢出

问题描述

我正在用vba编程一些winsocket应用程序,并且存在超时的可能性。

我已经尝试过API-Timer Settimer和Killtimer,但是在启动和停止与普通vba程序平行的计时器时,您必须要小心。

vba中包含的timer()函数不是很精确,因此我决定在32位办公系统上使用GetTickCount对计时器进行编程。

但是这里的问题是24.9天后计数器重新启动。在较新的系统上,您现在可以使用longptr和GetTickCount64 i,但是它也应该在旧的Windows 32位系统上运行。

所以我对类似环形计数器的代码进行了大约1秒钟的编码,但是我不确定

  • 如果您可以更好地编写代码,或者
  • 即使它在24.9天后仍然有效

那么您能对我的测试程序(用excel vba编码)做出一些回应吗?

Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long

Sub stest()
Dim intStart As Integer
Dim intDelta As Integer
Do
    intStart = fxTimer1024
    intDelta = fxTimerDelta(intStart)
    do while intDelta < 200
        DoEvents 'endless loop,use ctrl+pause/break to end
        intDelta = fxTimerDelta(intStart)
    Loop
    Debug.Print intStart,intDelta
Loop
End Sub

Function fxTimer1024()
fxTimer1024 = GetTickCount() Mod 1024
End Function

Function fxTimerDelta(intStart)
Dim x As Long
x = fxTimer1024
If intStart > x Then
   fxTimerDelta = x + 1024 - intStart
Else
   fxTimerDelta = x - intStart
End If
End Function

解决方法

谢谢,货币是一个难题,特别是对于其他问题,这里的问题是GetTicketCount的返回值仅为4个字节整数,并且仅计入该值,因此将其分配给货币没有任何作用变量。