解决GetTickCount的问题

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;

猜你喜欢

转载自www.cnblogs.com/IDELPHI/p/GetTickCount.html