我开发了使用Delphi 6和asyncfree
通过虚拟串口传输字节的应用程序我需要在10个字节后延迟传输以同步传输。我使用windows.sleep(1)
。
当我从Delphi IDE运行它时,该应用程序运行良好。当我关闭Delphi并从exe运行应用程序时......应用程序变慢。
是什么原因?
答案 0 :(得分:2)
Delphi IDE显然将系统计时器刻度设置为更高的分辨率。您可以使用timeBeginPeriod/timeEndPeriod
函数在应用程序中执行相同操作。请参阅msdn document以及this one regarding sleep function
uses MMSystem;
if TimeBeginPeriod(1) = TIMERR_NOERROR then // 1 ms resolution
try
// The action or process needing higher resolution
finally
TimeEndPeriod(1);
end;
只是为了证明我在简单应用后所做的效果,所以任何有兴趣的人都可以自己检查:
uses System.DateUtils, MMSystem;
var
s, e: TTime;
procedure SomeDelay;
var
i: integer;
begin
s := Now;
for i := 1 to 1000 do
Sleep(1);
e := Now;
end;
procedure TForm19.btnWithClick(Sender: TObject);
begin
if TimeBeginPeriod(1) = TIMERR_NOERROR then // 1 ms resolution
try
SomeDelay; // The action or process needing higher resolution
finally
TimeEndPeriod(1);
end;
Memo1.Lines.Add('with ' + IntToStr(SecondsBetween(s, e)));
end;
procedure TForm19.btnWithoutClick(Sender: TObject);
begin
SomeDelay; // The action or process needing higher resolution
Memo1.Lines.Add('without ' + IntToStr(SecondsBetween(s, e)));
end;
输出:
with 1
without 15
注意因为TimeBeginPeriod
会影响系统节拍,所以请务必关闭任何可能采用相同方法修改计时器节目的节目,例如多媒体和类似节目(以及Delphi IDE。)