我用下面函数 取2次间隔 毫秒为什么会 扁大很多 ????
明明只有10 秒,但 显示出来 是 15秒 VarRecTime1:tdatetime;
function TForm1.GetRecTime( ): integer;
var
 tempi:longint;
begin        if VarRecTime = 0 then
    begin
           VarRecTime := gettickcount  ;
       result :=  0;
    end
    else
    begin
     tempi :=  gettickcount -  VarRecTime;
          VarRecTime :=  gettickcount ;         result :=   tempi;
    end;end;end;

解决方案 »

  1.   

    var
      VarRecTime1:tdatetime; //这里修改为VarRecTime1: Cardinal;function TForm1.GetRecTime( ): integer; 
    var 
      tempi:longint; 
    begin 
      if VarRecTime = 0 then 
      begin 
        VarRecTime := gettickcount  ; 
        result     := 0; 
      end 
      else 
      begin 
        tempi      := gettickcount - VarRecTime; 
        VarRecTime := gettickcount; 
        result     := tempi; //这里返回的就是毫秒数
      end; 
    end; 
      

  2.   

    var
      VarRecTime1:tdatetime; //这里修改为VarRecTime1: Cardinal;function TForm1.GetRecTime( ): integer; 
    var 
      tempi:longint; 
    begin 
      if VarRecTime = 0 then 
      begin 
        VarRecTime := gettickcount  ; 
        result     := 0; 
      end 
      else 
      begin 
        tempi      := gettickcount - VarRecTime; 
        VarRecTime := gettickcount; 
        result     := tempi; //这里返回的就是毫秒数
      end; 
    end;
      

  3.   

    var
      f,st,et: int64;
      tim:     double;
    QueryPerformanceFrequency(f);
    QueryPerformanceCounter(st);
    需要计算的程序段
    QueryPerformanceCounter(et);
    tim:=(et-st)/f //tim为时间,单位毫秒
      

  4.   

    本来时间片的分配就不是均匀的,没有什么好奇怪的,建议楼主直接用TTimer来做吧.误差会小点.
    或是用楼上的方法,精确计算. :)
      

  5.   

    如果你使用的是Sleep来计算间隔的话,差额是相当大的.MSDN有明显指出,其精确度最高为15~50毫秒之间,多次之后累积下来偏差值确实会相当大.
      

  6.   

    用TickCount 误差应该超过 20ms 用 TTimer 应该超过50ms你这里误差都是秒级了 >1000ms 看这部分代码应该没问题是不是上层调用代码不正确或没有正常刷新显示的原因呢?精确计时用mmSystem中的定时器可以做到 1ms 精度的计时
      

  7.   

    //取毫秒级时间精度(方法一):
    var
      t1,t2:int64;
      r1:int64;
    begin
      t1:=GetTickCount;//获取开始计数 WINDOWS API
      sleep(1000);{do...}//执行要计时的代码
      t2:=GetTickCount;//获取结束计数值
      r1:=t2-t1;//取得计时时间,单位毫秒(ms)
      showmessage(inttostr(r1));
    end;//取毫秒级时间精度(方法二):
    //use DateUtils;//引用DateUtils单位
    var
      t1,t2:tdatetime;
      r1:int64;
    begin
      t1:=now();//获取开始计时时间
      sleep(1000);{do...}//执行要计时的代码
      t2:=now();//获取结束计时时间
      r1:=SecondsBetween(t2,t1);//取得计时时间,单位秒(s)
      r1:=MilliSecondsBetween(t2,t1);//取得计时时间,单位毫秒(ms)
      showmessage(inttostr(r1));
    end;
    //注:以上两种方式经本人测试好像只能产生0.01秒的计时精度//取系统级时间精度:
    var
      c1:int64;
      t1,t2:int64;
      r1:double;
    begin
      QueryPerformanceFrequency(c1);//WINDOWS API 返回计数频率(Intel86:1193180)(获得系统的高性能频率计数器在一毫秒内的震动次数)
      QueryPerformanceCounter(t1);//WINDOWS API 获取开始计数值
      sleep(1000);{do...}//执行要计时的代码
      QueryPerformanceCounter(t2);//获取结束计数值
      r1:=(t2-t1)/c1;//取得计时时间,单位秒(s)
      r1:=(t2-t1)/c1*1000;//取得计时时间,单位毫秒(ms)
      r1:=(t2-t1)/c1*1000000;//取得计时时间,单位微秒
      showmessage(floattostr(r1));
    end;