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
相关产品推荐
相关产品推荐

