GetTickCount是一个api,它是反应到从开机到当前的毫秒数,这个很好.可以做一些短途的计时器.
比如说做服务器中对象池计时器,对象超过多少时间就自动释放对象.
但是GetTickCount也有一个麻烦的地方,就是在电脑运行了49.7天之后,数字会置0 ,然后从0开始.这样的话,简单的时间判断可能会造成49.7天后的bug,那么怎办呢?其实可以用一点小技巧就可以解决.
看下面的代码,Judge1是判断函数,
i 是当前的计时点
OutSec 是超时秒数.
NowTick 是当前的Tick,即当前时间点.
可以看到以下的测试代码模拟了几种计时起点和当前的Tick,但是神奇的判断Judge1都可以把时间正确判断.
1 procedure TForm4.FormCreate(Sender :TObject); 2 var 3 I :UInt64; 4 NowTick :LongWord; 5 6 OutSec :Word; 7 8 procedure Judge1(); 9 var 10 Tmp :UInt64; 11 begin 12 Tmp := I + OutSec * 1000; 13 14 if Tmp > LongWord.MaxValue then begin 15 if (I > NowTick) and (NowTick > Tmp - Longword.MaxValue) then 16 ShowMessage('ok2'); 17 end 18 else begin 19 if NowTick > Tmp then 20 ShowMessage('ok1'); 21 end; 22 end; 23 24 begin 25 I := 10; 26 OutSec := 2; 27 NowTick := 2020; 28 Judge1(); 29 30 I := 10; 31 OutSec := 2; 32 NowTick := 2010; 33 Judge1(); 34 35 I := 10; 36 OutSec := 2; 37 NowTick := 2009; 38 Judge1(); 39 40 I := Longword.MaxValue - 3000; 41 OutSec := 2; 42 NowTick := Longword.MaxValue - 2000; 43 Judge1(); 44 45 I := Longword.MaxValue - 3000; 46 OutSec := 2; 47 NowTick := Longword.MaxValue - 1000; 48 Judge1(); 49 50 I := Longword.MaxValue - 3000; 51 OutSec := 2; 52 NowTick := Longword.MaxValue - 999; 53 Judge1(); 54 55 I := Longword.MaxValue - 3000; 56 OutSec := 2; 57 NowTick := Longword.MaxValue - 50; 58 Judge1(); 59 60 I := Longword.MaxValue - 300; 61 OutSec := 2; 62 NowTick := Longword.MaxValue - 50; 63 Judge1(); 64 65 I := Longword.MaxValue - 300; 66 OutSec := 2; 67 NowTick := 20; 68 Judge1(); 69 70 I := Longword.MaxValue - 300; 71 OutSec := 2; 72 NowTick := 1700; 73 Judge1(); 74 75 I := Longword.MaxValue - 300; 76 OutSec := 2; 77 NowTick := 1701; 78 Judge1(); 79 80 end;