sleep函数的最小延时时间竟然为10ms?

redhaifeng 2004-09-23 01:46:06
最近在使用Sleep函数延时需要延时2ms的时候,竟然发现Sleep函数是以10ms为单位进行延时的,也就是说所有小于10大于0的情况下都是10ms,所有大于10小于20的情况都是20,以此类推!大家都发现这个问题了吗?
那么下面的问题是如果我要实现2ms的延时该如何做?前提条件是与Sleep一样不能占用CPU资源,所以循环的方法就不大可行了。
...全文
2436 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly_liuyang 2004-09-23
  • 打赏
  • 举报
回复
Sleep是不准确的

参看
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200249

http://lysoft.7u7.net
耙子 2004-09-23
  • 打赏
  • 举报
回复
Sleep 的精度这个要追溯的PC的组成原理了。

它们根本上都是从8254产生的脉冲,它直接影响8259产生时钟中断,这个频率从PC开始就一直是1.19M (好像是这个数),经过触发器的分频,它产生了每隔52ms一个int 8h中断。

dos下的sleep的精确极限就是这个52ms,
后来win95开始 进一步支持了10ms左右的精度(不知道原理),可能是8254提供了新的基准,因为它本身能产生3个时钟。

现在看不到8254了,都集中在北桥了。

8254 直接连到8255 接到PC喇叭,可以发声。
同时它还是很多游戏的始终基准,所以修改了8254的寄存器,改变这个频率,就能修改有些得速度,这就是变速齿轮的原理。
flyinwuhan 2004-09-23
  • 打赏
  • 举报
回复
使用“高分辨率性能计数器”high-resolution performance counter

http://msdn.microsoft.com/msdnmag/issues/04/03/HighResolutionTimer/default.aspx
redhaifeng 2004-09-23
  • 打赏
  • 举报
回复
今天又试验发现:Sleep函数如果连续调用那么不足10ms的时间会同前面累加起来,也就是累加达到10ms时就休眠10ms。关于 riding(ride) 说的用Timer对象去实现,我不知道是否可行,因为我的要求是在一个死循环的循环体中能放弃2ms左右(5ms也能接受)的CPU时间,然后再继续执行后面的代码,否则的CPU的占用率太高了,而不是要求我的函数或代码多长时间去执行一次,所以Timer是否有用?之所以可以放弃2ms的CPU时间是因为我在执行一句代码后,后面必须等到2ms以后才可能有结果,所以即使不放弃这个时间我也必须要循环等待到2ms以后才能判断是否有结果,所以放弃CPU时间是最好的选择!
halfdream 2004-09-23
  • 打赏
  • 举报
回复
确实如此,它的精度只有那么高。
而且在瘟九八下精度更差得多。

sleep
getTickCount
TTimer
这三个东西都是同一精度级的。
riding 2004-09-23
  • 打赏
  • 举报
回复
我知道Ontimer事件的精度在50ms左右,你说sleep在10ms,真的侧侧,另外sleep使线程睡眠的函数,windows NT这样的操作系统一个cpu的时间片在2ms左右,无怪胡10ms的精度。搂住要用2ms的精度
时间,建议搂住用Timer对象,他和semphore,mutex等都是windows内建对象,用的是硬件时钟,应当能
满足搂住的需要,在msdn的帮助中有,属于windows 的api,delhi没有封装的。
marf_cn 2004-09-23
  • 打赏
  • 举报
回复
redhaifeng 2004-09-23
  • 打赏
  • 举报
回复
ProcessMessage难道就不消耗CPU资源了吗?能有Sleep的效率高吗?我现在不是要循环的程序还能响应其它事件,而是要CPU的占用率降低,因为这个过程本来就是用线程处理的!
大家还有更好的办法吗?还有谁能解释一下Sleep到底为何只能精确到10ms ?
xiaoxiao197821 2004-09-23
  • 打赏
  • 举报
回复
aMs毫秒
procedure SysDelay(aMs: Longint);
var
TickCount : LongInt;
begin
TickCount:=GetTickCount;
while GetTickCount - TickCount < aMs do
Application.ProcessMessages;
end;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧