You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WaitForSingleObject跨Windows版本定时不准,求跨平台精准定时方案

精准定时与串口通信问题:Windows版本差异及解决方案

我有一个用Delphi BDS 2006开发的旧应用,该应用通过串口与外部设备通信,对数据发送的定时精度要求较高,需达到2ms。我使用WaitForSingleObject设置2ms超时来实现定时,此方案在Windows 7上运行正常,但在后续Windows版本中定时精度变得(非常)不准确。

为测试差异,我编写了一个简单测试程序并在不同Windows版本上运行,代码如下:

unit Unit24;

interface

uses
  Windows, SysUtils, Classes, Forms, DateUtils;

type
  TTH= class(TThread)
  protected
    procedure Execute; override;
  end;

  TForm24 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    S: string;
  end;

var
  Form24: TForm24;

implementation

{$R *.dfm}

procedure TTH.execute;
var
  h: THandle;
  t: TDateTime;
begin
  h:= CreateEvent(nil, False, False, nil);
  while not Terminated do
  begin
    t:= Now;
    WaitForSingleObject(h, 2);
    Form24.S:= Form24.S+ IntToStr(Round(MilliSecondSpan(Now, t)))+ ',';
  end;
end;

procedure TForm24.FormCreate(Sender: TObject);
var
  F   : TextFile;
  TH  : TTH;
begin
  TH:= TTH.Create(False);
  Sleep(100);
  TH.Terminate;
  Application.Terminate;
  AssignFile(F, 'res.log');
  Rewrite(F);
  Write(F, S);
  CloseFile(F);
end;

end.

不同操作系统上的测试结果如下:

  • Win7:
    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
  • Win10:
    11,16,15,16,15,15,16,
  • Win11:
    8,13,14,13,14,13,13,14,
  • Win Server 2022:
    3,2,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,2,2,3,3,

可见Win10、Win11的定时效果很差,Win Server 2022也存在额外1ms的定时误差。请问是否有跨平台的精准定时解决方案?


补充说明

感谢@whosrdaddy的建议,但我的问题略有不同。我最初在DOS环境下开发该项目,可完全掌控定时;首个Windows版本针对XP开发,当时定时精度粗糙(因定时分辨率低),但通过一些技巧解决了问题;Win7提供了稳定可靠的定时,因此我们一直使用至今,但Win7已过时无法长期使用。遗憾的是,最新操作系统不仅定时处理随意(我认为问题不在分辨率),串口及外部设备管理也存在问题。此前的定时解决方案虽能解决定时问题,但串口数据有时会延迟到达应用(即使关闭缓冲区),导致无法在5ms内回复,因此该方案也不可靠。最终我决定将敏感定时逻辑转移到外部设备(ESP32),使项目不再受Windows不可靠性影响。

内容的提问来源于stack exchange,提问作者digi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:33:28