德尔福的传输延迟

时间:2017-10-12 18:48:24

标签: delphi windows-7

我开发了使用Delphi 6和asyncfree

通过虚拟串口传输字节的应用程序

我需要在10个字节后延迟传输以同步传输。我使用windows.sleep(1)

当我从Delphi IDE运行它时,该应用程序运行良好。当我关闭Delphi并从exe运行应用程序时......应用程序变慢。

是什么原因?

1 个答案:

答案 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。)