解决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 * ; //时长右边界 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;
解决GetTickCount的问题的更多相关文章
- 解决 WinXP下 libcurl.dll 无法定位程序输入点GetTickCount64问题
1. 问题描述 用 IDA 打开libcurl.dll 可以在导入表看到对 GetTickCount64的引用,在 xp 的kernel32.dll中没有 GetTickCount64, 所以会出现 ...
- mmz-asio4delphi死链接的解决办法
最近一段时间,因为忙于网络的项目,特意到网上找了些例子,特意花时间研究了一下马敏钊写的 mmz-asio4delphi 感觉很好用,不过深入研究之后,发现一个问题. 马大的这个代码,会产生死链接. ...
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
- DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享
DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- java中文乱码解决之道(一)-----认识字符集
沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
随机推荐
- 排查在 Azure 中新建 Windows 虚拟机时遇到的经典部署问题
尝试创建新的 Azure 虚拟机 (VM) 时,遇到的常见错误是预配失败或分配失败. 当由于准备步骤不当,或者在从门户捕获映像期间选择了错误的设置而导致 OS 映像无法加载时,将发生预配失败. 当群集 ...
- ScriptManager的使用方法 .(转)
从这一节开始我将和大家一起学习ASP.NET AJAX的服务器端控件的用法.首先,安装ASPAJAXExtSetup.msi,可以到微软官方网站上去下载.安装之后当你新建项目的时候会多出一个ASP.N ...
- WMIC应用
WMI管理:wmic product 列出已安装软件 wmic product where name='tools-windows' call Uninstall 卸载已安装软件 进入wmi ...
- Excel操作之级联菜单
设置级联菜单主要用的是excel的数据验证功能.下面以简单的设置城市选择框为例: 1.准备好数据 2.给所有省份起个名称(例如:省份),然后同样方法给每个省份所对应的城市以其省份命名,(例如:南京.苏 ...
- c++计算器后续(5)
自娱自乐: 大概是重新开始玩qt,然后MFC和第四步附加的作业大概不会去玩了.以上. QT相关: 阶段一: 原来作业里举了qt和mfc这两个做界面的东西,网上都说qt容易上手,学了mfc再来看qt简直 ...
- 用ABAP代码读取S/4HANA生产订单工序明细
在S/4HANA事务码CO03显示的Production Order里,我希望用ABAP代码显示出该订单的operation(工序)ID,描述和状态Status,如下图所示: 很简单的几行ABAP代码 ...
- chrome最新版49跨域问题
chrome最新版49跨域问题 一.最新版49要用新的参数 加--user-data-dirwindows:"C:\Program Files\Google\Chrome\Applica ...
- Linux和Unix的区别
Linux Unix 免费 收费 开源 不开源 硬件无要求 有要求 IBM Sun Hp 主流的Linux的发型版本: RedHat Fedora Mand ...
- java中JVM的原理重温【转】
一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...
- Dockerfile.md
Docker 使用 前提条件 Docker目前只能在64位CPU架构的计算机上运行(目前只能是x86_64 .amd64). Linux 3.8 或 更高版本的内核.3.8之前的版本也能运行,但效果不 ...