在线程中精确到1ms或者更小的延时方法?(100分)

  • 主题发起人 主题发起人 未来107
  • 开始时间 开始时间

未来107

Unregistered / Unconfirmed
GUEST, unregistred user!
线程中,我们往往用sleep可以大大降低cpu的占用率,因为它可以将暂时将cpu控制权
转交给其他线程,但是sleep的延时精度不够高,比如sleep(1),实际上并不是延时1ms
而往往是10毫秒左右,这就导致了很多实时场合不适应的问题(10ms延时太长了),这就
需要一种能够代替sleep的方法。很多网友提出了用如下的方式,的确下面的方式可以精确到1ms一下,但是他有个致命的缺点就是跟sleep不一样,sleep可以转交控制全,而下面的
方式不能丝毫降低cpu的占用率,甚至更加吃cpu,因为其他是死循环阿!各位朋友,有没有
精确到<=1ms又可以降低cpu占用率的方法!
LARGE_INTEGER li=0;
while(li<=interval)
{
QueryPerformanceCounter(&amp;li)
}
 
win98的定时器最小精度为50ms左右,winnt/win2000的定时器最小精度为10ms左右,所以使用普通定时器没办法解决,但可以做如下尝试:
1、LARGE_INTEGER li=0;
while(li<=interval)
{
sleep(0);//这也可以交控制权
QueryPerformanceCounter(&amp;li)
}
2、使用多媒体定时器。
 
应该不行吧,就象TYZhang所说,WINDOWS本身就不是实时操作系统,精确度达不到这么高
 
可能是不行的吧?必竟windows不是实时操作系统。
 
TYZhang
我测试一下!
 
只要让出控制权就不可能保证精度。
 
procedure delay(interval:integer);
var
be:TLargeInteger;
ed:TLargeinteger;
begin
QueryPerformanceCounter(BE);
ED:=BE;
while(ED-BE<=interval)do
begin
sleep(0);//这也可以交控制权
QueryPerformanceCounter(ED);
end;
end;
这样不行哦!跟sleep(1)不一样的,sleep(1)占用率为10~20%,用这个是50%
 
如果不能精确到1m且能够转交cpu那么,有什么方法可以降低cpu占用率呢,在不用sleep函数的情况下?
 
从你说的来看sleep(0)也的确是转交了控制权。不过时间非常的短而已。
 
sleep(0)跟不用sleep是一样的,所以我认为他并没有转交控制权
 
uses SyncObjs;
procedure delay(interval:integer);
var Event:TSimpleEvent;
begin
Event:=TSimpleEvent.Create;
Event.WaitFor(interval);
Event.ResetEvent;
FreeAndNil(Event);
end;
 
to 未来107:
你怎么测得sleep(1)延时10ms左右?
我用下面的程序得到的数值就是100ms左右的?
var
dw:DWORD;
n:Integer;
begin
dw:=GetTickCount;
for n:=1 to 100do
Sleep(1);
Label1.Caption:=IntToStr(GetTickCount-dw);
end;
 
这个10毫秒,是参考有关资料来的,因为我需要实时,所以对这个10毫秒没有做验证
听说 <<delphi深度历险>>有相关介绍,只是我没有书籍
 
可以考虑使用线程定时器:
http://www.torry.net/vcl/datetime/timers/hptimer.zip
 
应该用汇编指令吧????
 
procedure Delay (Msecs : Integer);
var
FirstTickCount : real;
begin
FirstTickCount := GetTickCount;
Repeat
Until ((GetTickCount - FirstTickCount) >= LongInt (Msecs));
end;
 
windows用中断来轮转cpu,看来要能够转交cpu控制权并做到极小延时,开来并不可能,苏了,就此结贴,感谢各位!
 
后退
顶部