解决GetTickCount的问题
Posted idelphi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决GetTickCount的问题相关的知识,希望对你有一定的参考价值。
GetTickCount是一个api,它是反应到从开机到当前的毫秒数,这个很好.可以做一些短途的计时器.
比如说做服务器中对象池计时器,对象超过多少时间就自动释放对象.
但是GetTickCount也有一个麻烦的地方,就是在电脑运行了49.7天之后,数字会置0 ,然后从0开始.这样的话,简单的时间判断可能会造成49.7天后的bug,那么怎办呢?其实可以用一点小技巧就可以解决.
看下面的代码,Judge1是判断函数,
i 是当前的计时点
OutSec 是超时秒数.
NowTick 是当前的Tick,即当前时间点.
可以看到以下的测试代码模拟了几种计时起点和当前的Tick,但是神奇的判断Judge1都可以把时间正确判断.
rocedure TForm4.FormCreate(Sender :TObject); var I :UInt64; NowTick :LongWord; OutSec :Word; procedure Judge1(); var Tmp :UInt64; begin Tmp := I + OutSec * 1000; //时长右边界 if Tmp > LongWord.MaxValue then begin if (I > NowTick) and (NowTick > Tmp - Longword.MaxValue) then ShowMessage(‘ok2‘); end else begin if NowTick >= I then begin if NowTick > Tmp then ShowMessage(‘ok1‘); end else ShowMessage(‘ok3‘); end; end; begin I := 10; //i是时长左边界 OutSec := 2; //超时秒数 NowTick := 2020; //当前时间 Judge1(); I := 10; OutSec := 2; NowTick := 2010; Judge1(); I := 10; OutSec := 2; NowTick := 2009; Judge1(); I := Longword.MaxValue - 3000; OutSec := 2; NowTick := Longword.MaxValue - 2000; Judge1(); I := Longword.MaxValue - 3000; OutSec := 2; NowTick := Longword.MaxValue - 1000; Judge1(); I := Longword.MaxValue - 3000; OutSec := 2; NowTick := Longword.MaxValue - 999; Judge1(); I := Longword.MaxValue - 3000; OutSec := 2; NowTick := 5; Judge1(); I := Longword.MaxValue - 3000; OutSec := 2; NowTick := Longword.MaxValue - 50; Judge1(); I := Longword.MaxValue - 300; OutSec := 2; NowTick := Longword.MaxValue - 50; Judge1(); I := Longword.MaxValue - 300; OutSec := 2; NowTick := 20; Judge1(); I := Longword.MaxValue - 300; OutSec := 2; NowTick := 1700; Judge1(); I := Longword.MaxValue - 300; OutSec := 2; NowTick := 1701; Judge1(); end;
以上是关于解决GetTickCount的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何解决游戏中出现“fail to hook gettickcount”的问题?
打开软件时出现无法定位程序输入点 GetTickCount64 于动态链接库 KERNEL32.dll 上。
C GetTickCount(windows函数)到时间(纳秒)
Win10下NBA 2K15运行时提示fail to hook GetTickCount怎么办,,我看有人说win10能玩啊!!??