多媒体计时器函数原型如下 (最低系统支持 xp)
MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent );
nDelay 事件周期,单位毫秒。
nDelay 最大支持429496毫秒。
微软的解释
症状
如果通过调用 API timeSetEvent() 多 429,496 毫秒事件延迟设置计时器,系统将不会调用返回的时间。
原因
这是 32 位长 timeSetEvent uDelay 参数的溢出。
即使您将 uDelay 参数设置以毫秒为单位,内部在函数中,它将使用 100 纳秒为单位。因此,429,496 ms (4,294,960,000 = 0xFFFFE380) 为最大值。这是大约 7 分 9 秒。如果您将 uDelay 设置为 429,497 将几乎立即会发生事件。
如果我们检查这些值以十六进制格式,我们可以看到:
仅在使用 TIME_PERIODIC 模式时,将发生此问题。
即使您将 uDelay 参数设置以毫秒为单位,内部在函数中,它将使用 100 纳秒为单位。因此,429,496 ms (4,294,960,000 = 0xFFFFE380) 为最大值。这是大约 7 分 9 秒。如果您将 uDelay 设置为 429,497 将几乎立即会发生事件。
如果我们检查这些值以十六进制格式,我们可以看到:
429,496(ms) * 10000 = 4,294,960,000 (100ns) = 0xFFFFE380
429,497(ms) * 10000 = 4,294,970,000 (100ns) = 0x00000a90
第二个值超过限制,十六进制值开始重新计算。
仅在使用 TIME_PERIODIC 模式时,将发生此问题。