解决GetTickCount的问题
GetTickCount是一个api,它是反应到从开机到当前的毫秒数,这个很好.可以做一些短途的计时器.
比如说做服务器中对象池计时器,对象超过多少时间就自动释放对象.
但是GetTickCount也有一个麻烦的地方,就是在电脑运行了49.7天之后,数字会置0 ,然后从0开始.这样的话,简单的时间判断可能会造成49.7天后的bug,那么怎办呢?其实可以用一点小技巧就可以解决.
看下面的代码,Judge1是判断函数,
i 是当前的计时点
OutSec 是超时秒数.
NowTick 是当前的Tick,即当前时间点.
可以看到以下的测试代码模拟了几种计时起点和当前的Tick,但是神奇的判断Judge1都可以把时间正确判断.
rocedure TForm4.FormCreate(Sender :TObject); varI :UInt64;NowTick :LongWord;OutSec :Word;procedure Judge1();varTmp :UInt64;beginTmp := I + OutSec * 1000; //时长右边界if Tmp > LongWord.MaxValue then beginif (I > NowTick) and (NowTick > Tmp - Longword.MaxValue) thenShowMessage('ok2');endelse beginif NowTick >= I then beginif NowTick > Tmp thenShowMessage('ok1');endelseShowMessage('ok3');end;end;beginI := 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;
转载于:https://www.cnblogs.com/IDELPHI/p/GetTickCount.html
解决GetTickCount的问题相关推荐
- javaEE面试重点
Hibernate工作原理及为什么要用? 原理: 1. 读取并解析配置文件 2. 读取并解析映射信息,创建SessionFactory 3. 打开Sesssion 4. 创建事务Transation ...
- mmz-asio4delphi死链接的解决办法
最近一段时间,因为忙于网络的项目,特意到网上找了些例子,特意花时间研究了一下马敏钊写的 mmz-asio4delphi 感觉很好用,不过深入研究之后,发现一个问题. 马大的这个代码,会产生死链接. t ...
- 网络游戏程序中解决加载卡顿的有效方法
对于3d视频游戏来说,游戏引擎的性能是至关重要的.玩家在体验一款游戏时,游戏的流畅度是最基本的要求.与单机游戏不同,网络游戏更需要考虑性能问题,因为无法像单机游戏那样,控制游戏元素的复杂度来达到效率的 ...
- VMware QueryPerformanceCounter/GetTickCount 悬案
最近发现在VMware的客户机上,两次 QueryPerformanceCounter 相差的数值会特别大.还不知道如何解决.. 测试程序如下 #include <windows.h>DW ...
- 使用IHTMLDocument3 的getElementById获取控件总是返回空的解决方法
调用的参数书写都正确,可是每次调用pElem都返回空指针? CComPtr<IDispatch> pDisp = (IDispatch*)GetDocument(); CComPtr< ...
- OpenPlanner变道遇到的问题及解决
OpenPlanner规划全局路径,如果要支持实时根据环境更新路径(变道.改变路径)需要在op_global_planner中勾选Lane Changing和Replanning两个功能 此外还要在o ...
- [Delphi]:解决3DMark闪退及3DMark宕的问题
为了解决一些3DMark的问题,例如闪退,跑的过程中3DMark程序无响应的.于是就想个办法实现解决这两个问题,也算是下SW workaround的吧.避免不必要的麻烦~ unit main;inte ...
- 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题
继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...
- 解决gitte提交报错 error: GE007: Your push would publish a private email address.
错误情况: gitte提交报错,无法提交上去,报错如下: remote: Powered by GITEE.COM [GNK-6.0] remote: error: GE007: Your push ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
最新文章
- 3软件测试原理与软件缺陷
- 520这天,我突然意识到,她根本配不上我这么聪明的男人
- 使用Struts2上传文件超过2M报错解决方法
- jmeter(三)参数化
- Intel 64/x86_64/IA-32/x86处理器基本执行环境 (1) - 32位执行环境概述
- 教育部成立校外教育培训监管司 K12迎最强监管 教育中概股再跳水
- 忘记commit也会造成select查询的性能问题
- mysql没有group by_MySQL:不在GROUP BY中
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---35
- KCP - A Fast and Reliable ARQ Protocol
- C++中指针优点与线程中指针变量访问
- c语言图形显示功能,C语言图形编程(二、图形显示).doc
- 阿里云datav自定义组件,引入高德地图API
- ArcGIS API For JavaScript 利用GP服务生成等值线、等值面(二)之生成等值面
- android svg 线条动画教程,SVG 实现复杂线条动画
- 阿里巴巴与山东省人民政府签署战略合作协议
- Java开发入门学习线路图+配套Java基础视频教程分享
- 第83节:Java中的学生管理系统分页功能
- 卸载MySQL残余及修改密码
- java中短信验证登录_java实现短信验证码功能