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