怎样精确的让当前操作等待1ms (在不花CPU时间的前提下) (200分)

  • 主题发起人 主题发起人 wingool
  • 开始时间 开始时间
W

wingool

Unregistered / Unconfirmed
GUEST, unregistred user!
我试了sleep(1),但是我试出来是sleep(10)以下的时间都是14毫秒左右,而且还占用CPU时间的<br>我用for循环自己算一毫秒又占用着cpu时间片<br>谁能告诉我怎样使当前操作等待1毫秒<br><br>大家帮帮忙!
 
WaitForSingleObject<br>可以吗?
 
我去试下 WaitForSingleObject ==
 
WaitForSingleObject 这个函数不行 <br><br><br>&nbsp; &nbsp; t:=CreateEvent(nil,True,True,nil);<br>&nbsp; &nbsp; ResetEvent(t);<br><br>用<br>&nbsp; &nbsp; queryperformancecounter(cc1);<br>&nbsp; &nbsp; WaitForSingleObject(t,1);<br>&nbsp; &nbsp; queryperformancecounter(cc2);<br><br>cc2-cc1 = 大约15毫秒
 
大家帮帮忙 在线等!
 
当前时间2004.06.02 18:36
 
用它呢:<br>procedure Delay(dwMilliseconds: Longint); <br>var <br>&nbsp; iStart, iStop: DWORD; <br>begin <br>&nbsp; iStart := GetTickCount; <br>&nbsp; repeat <br>&nbsp; &nbsp; iStop := GetTickCount; <br>&nbsp; &nbsp; Application.ProcessMessages; <br>&nbsp; until (iStop - iStart) &gt;= dwMilliseconds; <br>end; <br>
 
&nbsp; &nbsp;queryperformancecounter(f1);<br>&nbsp; &nbsp; QueryPerformanceFrequency(frequency);<br>&nbsp; &nbsp; while True do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; queryperformancecounter(f2);<br>&nbsp; &nbsp; &nbsp; if (f2-f1)/frequency &gt; 0.001 then Break;<br>&nbsp; &nbsp; end;<br>我用这个可以精确到0.0001 毫秒 但是太占用CPU时间
 
直接用汇编写
 
1。sleep不占用Cpu <br>2。和汇编没有关系。
 
sleep(1)有些情况可能不精确<br>GetTickCount可以更精确的计算毫秒,但占不占CPU不知道
 
queryperformancecounter<br>比GetTickCount精确多了 <br>原理应该差不多的 不过都一直都要占用cpu在计算的 所以不行啊<br><br>汇编不会啊!<br>谢谢大家,大家继续帮我出主意啊 !!<br>
 
使用线程定时器:<br>Threaded Timer v.1.24 &nbsp;FWS 6 Kb 2 Mar 2004 <br>By Carlos Barbosa. This component has the same functionality of the default Timer component, [red]but it provides a real resolution of 1 milisecond[/red]. <br>http://www.torry.net/vcl/datetime/timers/hptimer.zip &nbsp;<br>
 
因为windows是时间轮片的多任务系统,就算能够精确的延时,也无法精确的验证,比如:<br>queryperformancecounter(cc1);<br>WaitForSingleObject(t,1);//假设此确能精确延时1ms<br>//但是到此处时,cpu的执行时间片已到别的程序了<br>queryperformancecounter(cc2);//等时间片轮寻回来时,已不是1ms了。<br>而且,这个延时还受到其他的高级别的线程的影响,所有只有当<br>queryperformancecounter(cc1);<br>WaitForSingleObject(t,1);<br>queryperformancecounter(cc2);<br>这三句话一次性执行完成,才会准确,但是WaitForSingleObject是考系统核心调度的,而系统的核心也是软件,也要进行就算,要耗时间的。<br>所以,个人认为要在windows系统中,在普通的程序中实现精确的1ms延时是不可能的。
 
TYZhang说的正是我想说的,windows是分割cpu时间给各个线程的,<br>所以具有一定的随机性,所以不太可能非常精确的。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2628185
 
用循环也不一定行的 因为操作系统在有的时候会做切换动作
 
To:刘麻子<br>&nbsp; &nbsp; 你看看我上面连接中的这个连接里面的Z_timer是怎么实现的,它可是可以精确到 0.015ms:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=267150
 
不好意思,我只是说,在某些巧合的情况下,可能会失真,<br>比如要1毫秒的精确度,而到了0.9毫秒,正好操作系统做切换动作,<br>这一切换,就不知道什么时候能回来了。仅此而已。 ^o^
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部