通过系统API函数实现精确记时

var C1, T1,T2:int64;
    R1,R2,R3:double;
begin
  QueryPerformanceFrequency(c1);   // WINDOWS API 返回计数频率(获得系统的高性能频率计数器在一毫秒内的震动次数)
  QueryPerformanceCounter(t1);     // WINDOWS API 获取开始计数值
  sleep(1111);                     // 需要计时的程序代码
  QueryPerformanceCounter(t2);     // 获取结束计数值
  R1:=(T2-T1)/C1;                  // 取得计时时间,单位秒(s)
  R2:=(T2-T1)/C1*1000;             // 取得计时时间,单位毫秒 (ms)
  R3:=(T2-T1)/C1*1000000;          // 取得计时时间,单位微秒
  Memo1.Lines.Add(Floattostr(R1)+'秒');
  Memo1.Lines.Add(Floattostr(R2)+'毫秒');
  Memo1.Lines.Add(Floattostr(R3)+'微秒');
end;

原理:利用Windows API函数实现精确记时的方法。
    1、QueryPerformanceFrequency
    QueryPerformanceFrequency函数获得高性能频率记数器的震荡频率。调用该函数后,函数会将系统频率记数器的震荡频率(每毫秒)保存到一个LargeInteger中。
    2、QueryPerformanceCounter。
    QueryPerformanceCounter函数获得系统频率记数器的震荡次数,结果也保存到一个Largenteger中。

    这样,就可以计算出二个时段,之间的差距了。
    1、首先使用QueryPerformanceFrequency获得高性能频率记数器每毫秒的震荡次数,
    2、然后在计时开始时使用QueryPerformanceCounter函数获得当前系统频率记数器的震荡次数。
    3、在计时结束时再调用QueryPerformanceCounter函数获得系统频率记数器的震荡次数。
    将两者相减,再将结果除以频率记数器每毫秒的震荡次数,就可以获得某一事件经过的准确时间。(次数除以频率等于时间)

结果:
    1.11026877822618 秒
    1110.26877822618 毫秒
    1110268.77822618 微秒

阅读更多
文章标签: Delphi
上一篇动态数组的使用
下一篇Delphi CompareValue函数的使用
想对作者说点什么? 我来说一句

利用API函数实现动画窗体

2011年07月13日 376KB 下载

禁用桌面属性

2013年01月08日 3KB 下载

修改主机的名称(VB)

2008年09月25日 1KB 下载

Visual Basic 6.0 控制系统音量

2011年07月04日 4KB 下载

没有更多推荐了,返回首页

关闭
关闭