zoukankan      html  css  js  c++  java
  • 解决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;
  • 相关阅读:
    BigDecimal 类型数据比较大小
    list排序,顺序,倒序
    springboot添加log4j日志配置log4j.xml生成日志文件
    mybatis使用@param("xxx")注解传参和不使用的区别
    jetty 插件启动指定端口号
    javaweb项目静态资源被拦截的解决方法
    day15 Python全局变量和局部变量
    阿里云操作视频
    Python基础视频
    马哥Python视频
  • 原文地址:https://www.cnblogs.com/IDELPHI/p/GetTickCount.html
Copyright © 2011-2022 走看看