今天做程序,需要计算一下调用函数之前和之后所用的时间,期间用了sleep,但是结果发现,我sleep(200),得到的时间竟然有188的时候,我不明白为什么会小于200,这是sleep的问题,还是我计算时间函数的问题呢?,求高人回答谢谢procedure TForm1.Button1Click(Sender: TObject);
var
    i,s:integer;
    ReadPre, ReadSith: TDateTime;
begin
    i:=0;
    while i<100 do
    begin
        ReadPre := Now;
        sleep(200);
        ReadSith := Now;
        s:= MilliSecondsBetween(ReadPre, ReadSith);
        memo1.Lines.Add(inttostr(s));
        inc(i);
    end;
end;end.如上 算出来的时间 每隔3,4个203 就会出现一个188这样的数,这是为什么呢

解决方案 »

  1.   

    你的问题我不知道,10毫秒比较对系统的影响很小,如果LZ不是做什么很精密的器件,我想也不必纠结与这点时间吧。如果必须要求那么准确,LZ能不能试下用TTimer组件,因为我一般很少用sleep,会让系统死在那里很不爽的!
      

  2.   


    你可以试试用Sleep(1),实际消耗的时间基本在15~16毫秒
      

  3.   


    procedure MyWait(iLen:DWORD);
    var
      dwWait :DWORD;
    begin
      dwWait := GetTickCount();
      while GetTickCount - dwWait < iLen do
      begin
        sleep(1);
        Application.ProcessMessages;
      end;
    end;试试这个
      

  4.   

    不好意思 这个怎么用?MyWait当函数用么?
      

  5.   

    sleep(1)不是1毫秒么?我刚试了一下,大部分是0,每隔几个0 有个15ms。这怎么回事 怎么又大了,我刚才那个是每隔几个正常的有几个小的啊
      

  6.   

    应该是没什么影响,就是想知道为什么会出现这种状况。你不用sleep用什么?sleep是延时的函数吧?Timer不是每隔多长时间执行一次某个程序么,这俩东西不一回事吧?
      

  7.   

    间隔还是使用GetTickCount
    sleep 是暂停的意思。比如你拖动窗口也是会占用时间的。
      

  8.   

    太精确了占用CPU就很高,绝大部分API的精度都是15一个片,
      

  9.   

    你说的这两个功能相同么?
    有人推荐我用GetTickCount
    但是没用过
      

  10.   

    GetTickCount的精度也不够,大约10毫秒左右.
      

  11.   

    GetTickCount 我试过了,出现同样的问题,应该是精度的问题
      

  12.   

    http://topic.csdn.net/u/20120221/09/3e646497-7b71-4c26-9336-ec79e6fb6701.html
    这个帖子 没人回复 谁去接下分啊 20分也是分啊