我想延迟1秒钟,再执行后面的指令,请问如何实现(50分)

  • 主题发起人 主题发起人 fscdc1
  • 开始时间 开始时间
F

fscdc1

Unregistered / Unconfirmed
GUEST, unregistred user!
我想延迟1秒钟,再执行后面的指令,请问如何实现,有什么函数
 
Sleep(1000);
 
timer空件
 
楼上两种都可以。用sleep(1000)的话,会引起主线程的阻塞,表现在界面上,就是不会动。<br>用timer不会有这种情况。
 
都被你們說了。我只好頂下了。
 
GetTickCount获取开机以来的毫秒数
 
好象我只会上面的这两个方法,其他的没试过..顶.. &nbsp;了
 
Var<br>&nbsp; T:DWORD;<br>begin<br>&nbsp; ...<br>&nbsp; T:=GetTickCount;<br>&nbsp; While GetTickCount-T&lt;1000 Do<br>&nbsp; &nbsp; Application.ProcessMessages;<br>&nbsp; ...<br>end;<br>这样不会造成主线程的阻塞,就是不知道在子线程里面是否安全
 
如果要求的1秒不是非常精确的话以上的方法均可。
 
同意sleeping(1000);
 
SleepEx(1000, True);
 
我也晚了,不过顶一下。
 
不一定用 TTimer 控件,直接用 SetTimer API 函数定好后面的过程入口就可以了,如果需要让参数传递过去,则可以先构筑个全局变量
 
procedure Delay(MSecs: Longint);<br>var<br>&nbsp; FirstTick, NowTick: Longint;<br>begin<br>&nbsp; FirstTick := GetTickCount;//获取结束计数值<br>&nbsp; repeat<br>&nbsp; &nbsp; &nbsp;Application.ProcessMessages;<br>&nbsp; &nbsp; &nbsp;Sleep(1); &nbsp;//调节CPU占用率<br>&nbsp; &nbsp; &nbsp;NowTick := GetTickCount();<br>&nbsp; until (NowTick-FirstTick &gt;= MSecs) or (NowTick&lt;FirstTick);<br>end;
 
sleep()会引起主线程的阻塞,表现在界面上,就是不会动,也就是会影响业务操作。<br>{MyDelay1--use GetTickCount}<br>procedure mydelay1(msecs:dword);stdcall;//不会影响业务操作,但占用CPU大<br>var<br>&nbsp;begintime:dword;<br>begin<br>&nbsp;begintime:=gettickcount;<br>&nbsp;repeat<br>&nbsp; Application.ProcessMessages;<br>&nbsp;until gettickcount-begintime&gt;=msecs;<br><br>end;<br>{MyDelay2--use QueryPerformanceCounter}<br>procedure mydelay2(msecs:dword);stdcall;//不会影响业务操作,但占用CPU较多<br>var<br>&nbsp;rstart,rend,rfreq:TLargeInteger;<br>begin<br>&nbsp;{取得频率}<br>&nbsp;QueryPerformanceFrequency(rfreq);<br>&nbsp;rend:=round(msecs*rfreq/1000);<br>&nbsp;QueryPerformanceCounter(rstart);<br>&nbsp;rend:=rend+rstart;<br>&nbsp;repeat<br>&nbsp; QueryPerformanceCounter(rfreq);<br>&nbsp; Application.ProcessMessages;<br>&nbsp;until rfreq&gt;=rend;<br>end;<br>{mydelay3--use queryperformancecounter with calibration}<br>procedure mydelay3(msecs:dword);stdcall;//不会影响业务操作,但占用CPU小些,延时时间也比较准确,尤其是在毫秒级。<br>var<br>&nbsp;rstart,rend,rfreq:TLargeInteger;<br>begin<br>&nbsp;QueryPerformanceFrequency(rfreq);<br>&nbsp;rend:=Round(msecs*rfreq/1000);<br>&nbsp;QueryPerformanceCounter(rstart);<br>&nbsp;rend:=rend+rstart-PerformanceCounterOverhead*2;<br>&nbsp;repeat<br>&nbsp; QueryPerformanceCounter(rfreq);<br>&nbsp; Application.ProcessMessages;<br>&nbsp;until rfreq&gt;=rend;<br>end;<br>{call the performance counter to determine the time overhead}<br>function CalibratePerformanceCounterOverhead:TLargeInteger;<br>var<br>&nbsp;I:integer;<br>&nbsp;rstart,rend:TLargeInteger;<br>begin<br>&nbsp;QueryPerformanceCounter(rstart);<br>&nbsp;for i:=1 to 1000 do<br>&nbsp; QueryPerformanceCounter(rend);<br>&nbsp;result:=round((rend-rstart)/1000);<br>end;
 
嘿嘿——楼主大人从进论坛到现在,一共提了27个问题,但从来没有结束任何一个问题。<br><br>&nbsp; 所以——建议弟兄们还是省省吧——哪怕闭目养神也比回答这种人的问题好。
 
后退
顶部