• 解决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;
  • 相关阅读:
    Sonne的健身日志(4)
    Sonne的健身日志(13)16周腹肌计划第四周(2012.3.302012.4.6)
    Sonne的健身日志(1)
    Iphone升级ios6后很耗电的解决办法
    试驾凯迪拉克SRX
    Sonne的健身日志(6)
    Sonne的健身日志(10)16周腹肌计划第一周感受与体会
    关于Iphone 4 如何用itunes备份短信等设置
    上海人2
    签了个100万的合同,我却很失落
  • 原文地址:https://www.cnblogs.com/IDELPHI/p/GetTickCount.html
Copyright © 2020-2023  润新知