GetMessageTime是否像GetTickCount一样溢出

时间:2018-07-10 14:57:53

标签: winapi

GetMessageTime(因此,KBDLLHOOKSTRUCT time 成员)是否受到GetTickCount相同的限制,一旦价值跨越 49.7 天?

2 个答案:

答案 0 :(得分:2)

是的,备注部分甚至是这样。

答案 1 :(得分:2)

GetMesssageTimeGetTickCount都在达到最大值(由相应的返回值类型表示)之后回绕到最小值。返回类型不一致,其中GetMessageTime返回LONGsigned int),而GetTickCount返回DWORDunsigned int)。

GetMessageTime的文档要求:

  

GetMessageTime函数的返回值不一定会在后续消息之间增加,因为如果计时器计数超过长整数的最大值,则值[...] 将换为长整数的最小值

由于返回值的签名,GetTickCount的文档描述了一种不同的包装模式:

  

经过的时间存储为DWORD值。因此,如果系统连续运行49.7天,该时间将回绕为零

因此,两个返回值在不同的时间点包装为不同的值。 GetMessageTime在达到‭2147483647‬之后(大约在24.9天后)回绕为-2147483648,而当{‭1}}达到‭4294967295‬时回绕为0。初始回绕之后,两个返回值都以相同的频率回绕,其中时间点偏移一个周期的一半时间。

这是对C语言的保证。由于这是Windows,因此我们可以将自己限制在Win32 ABI的更强保证上,这需要二进制补码算法。鉴于此,GetTickCountGetMessageTime的返回值的二进制表示形式是相同的。如果决定将GetTickCount的返回值强制转换为GetMessageTime,则将观察到与DWORD相同的值换行。

我尚不完全清楚为什么GetTickCount返回带符号的值。选择它可能是为了使其更容易执行被认为是更常见的计算。不过那是猜测。 Raymond Chen的博客条目What clock do MSG.time and GetMessageTime use?提供了更多信息,但没有回答问题“为什么?”