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 * ; //时长右边界 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 := ; //i是时长左边界
OutSec := ; //超时秒数
NowTick := ; //当前时间
Judge1(); I := ;
OutSec := ;
NowTick := ;
Judge1(); I := ;
OutSec := ;
NowTick := ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := Longword.MaxValue - ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := Longword.MaxValue - ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := Longword.MaxValue - ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := Longword.MaxValue - ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := Longword.MaxValue - ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := ;
Judge1(); I := Longword.MaxValue - ;
OutSec := ;
NowTick := ;
Judge1(); end;
05-07 15:12