最近在使用Sleep函数延时需要延时2ms的时候,竟然发现Sleep函数是以10ms为单位进行延时的,也就是说所有小于10大于0的情况下都是10ms,所有大于10小于20的情况都是20,以此类推!大家都发现这个问题了吗?
那么下面的问题是如果我要实现2ms的延时该如何做?前提条件是与Sleep一样不能占用CPU资源,所以循环的方法就不大可行了。

解决方案 »

  1.   

    aMs毫秒
    procedure SysDelay(aMs: Longint);
    var
      TickCount       : LongInt;
    begin
      TickCount:=GetTickCount;
      while GetTickCount - TickCount < aMs do 
        Application.ProcessMessages;
    end;
      

  2.   

    ProcessMessage难道就不消耗CPU资源了吗?能有Sleep的效率高吗?我现在不是要循环的程序还能响应其它事件,而是要CPU的占用率降低,因为这个过程本来就是用线程处理的!
    大家还有更好的办法吗?还有谁能解释一下Sleep到底为何只能精确到10ms ?
      

  3.   

    我知道Ontimer事件的精度在50ms左右,你说sleep在10ms,真的侧侧,另外sleep使线程睡眠的函数,windows NT这样的操作系统一个cpu的时间片在2ms左右,无怪胡10ms的精度。搂住要用2ms的精度
    时间,建议搂住用Timer对象,他和semphore,mutex等都是windows内建对象,用的是硬件时钟,应当能
    满足搂住的需要,在msdn的帮助中有,属于windows 的api,delhi没有封装的。
      

  4.   

    确实如此,它的精度只有那么高。
    而且在瘟九八下精度更差得多。sleep
    getTickCount
    TTimer
    这三个东西都是同一精度级的。
      

  5.   

    今天又试验发现:Sleep函数如果连续调用那么不足10ms的时间会同前面累加起来,也就是累加达到10ms时就休眠10ms。关于 riding(ride) 说的用Timer对象去实现,我不知道是否可行,因为我的要求是在一个死循环的循环体中能放弃2ms左右(5ms也能接受)的CPU时间,然后再继续执行后面的代码,否则的CPU的占用率太高了,而不是要求我的函数或代码多长时间去执行一次,所以Timer是否有用?之所以可以放弃2ms的CPU时间是因为我在执行一句代码后,后面必须等到2ms以后才可能有结果,所以即使不放弃这个时间我也必须要循环等待到2ms以后才能判断是否有结果,所以放弃CPU时间是最好的选择!
      

  6.   

    使用“高分辨率性能计数器”high-resolution performance counterhttp://msdn.microsoft.com/msdnmag/issues/04/03/HighResolutionTimer/default.aspx
      

  7.   

    Sleep 的精度这个要追溯的PC的组成原理了。它们根本上都是从8254产生的脉冲,它直接影响8259产生时钟中断,这个频率从PC开始就一直是1.19M (好像是这个数),经过触发器的分频,它产生了每隔52ms一个int 8h中断。dos下的sleep的精确极限就是这个52ms,
    后来win95开始 进一步支持了10ms左右的精度(不知道原理),可能是8254提供了新的基准,因为它本身能产生3个时钟。现在看不到8254了,都集中在北桥了。8254 直接连到8255 接到PC喇叭,可以发声。
    同时它还是很多游戏的始终基准,所以修改了8254的寄存器,改变这个频率,就能修改有些得速度,这就是变速齿轮的原理。
      

  8.   

    Sleep是不准确的参看
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200249http://lysoft.7u7.net