delphi 中的传输延迟
Transmission delay in delphi
我开发了使用 Delphi 6 和 asyncfree
通过虚拟串口传输字节的应用程序
我需要在 10 个字节后延迟传输以同步传输。我用 windows.sleep(1)
.
当我从 Delphi IDE 运行 时,该应用程序运行良好。当我从 exe 关闭 Delphi 和 运行 应用程序时...应用程序变慢了。
这是什么原因?
Delphi IDE 显然将系统计时器滴答设置为更高分辨率。您可以使用 timeBeginPeriod/timeEndPeriod
函数在您的应用程序中执行相同的操作。参见 msdn document and also 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)。
我开发了使用 Delphi 6 和 asyncfree
通过虚拟串口传输字节的应用程序我需要在 10 个字节后延迟传输以同步传输。我用 windows.sleep(1)
.
当我从 Delphi IDE 运行 时,该应用程序运行良好。当我从 exe 关闭 Delphi 和 运行 应用程序时...应用程序变慢了。
这是什么原因?
Delphi IDE 显然将系统计时器滴答设置为更高分辨率。您可以使用 timeBeginPeriod/timeEndPeriod
函数在您的应用程序中执行相同的操作。参见 msdn document and also 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)。