0

我正在用 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
4

1 回答 1

0

谢谢,货币是一个很好的提示,特别是对于其他问题,这里的问题是GetTicketCount的返回值只有4字节整数并且只计入这个值,所以将它分配给货币变量没有效果。

于 2020-09-12T07:33:11.853 回答