unit WTimer; interface uses Windows, SysUtils, SyncObjs; type TWaitableTimer = class(TSynchroObject) protected FHandle: THandle; FPeriod: LongInt; FDueTime: TDateTime; FLastError: Integer; FLongTime: Int64; public constructor Create(ManualReset : Boolean; TimerAttributes: PSecurityAttributes; const Name : string ); destructor Destroy; override; procedure Start; procedure Stop; function Wait(Timeout: LongInt): TWaitResult; property Handle: THandle read FHandle; property LastError: integer read FLastError; property Period: integer read FPeriod write FPeriod; property Time: TDateTime read FDueTime write FDueTime; property LongTime: int64 read FLongTime write FLongTime; end; implementation { TWaitableTimer } constructor TWaitableTimer.Create(ManualReset: Boolean; TimerAttributes: PSecurityAttributes; const Name: string); var pName: PChar; begin inherited Create; if Name = '' then pName := nil else pName := PChar(Name); FHandle := CreateWaitableTimer(TimerAttributes, ManualReset, pName); end; destructor TWaitableTimer.Destroy; begin CloseHandle(FHandle); inherited Destroy; end; procedure TWaitableTimer.Start; var SysTime: TSystemTime; LocalTime, UTCTime: FileTime; Value: Int64 absolute UTCTime; begin if FLongTime = 0 then begin DateTimeToSystemTime(FDueTime, SysTime); SystemTimeToFileTime(SysTime, LocalTime); LocalFileTimeToFileTime(LocalTime, UTCTime); end else Value := FLongTime; SetWaitableTimer(FHandle, Value, FPeriod, nil, nil, False); end; procedure TWaitableTimer.Stop; begin CancelWaitableTimer(FHandle); end; function TWaitableTimer.Wait(Timeout: Integer): TWaitResult; begin case WaitForSingleObjectEx(Handle, Timeout, BOOL(1)) of WAIT_ABANDONED: Result := wrAbandoned; WAIT_OBJECT_0: Result := wrSignaled; WAIT_TIMEOUT: Result := wrTimeout; WAIT_FAILED: begin Result := wrError; FLastError := GetLastError; end; else Result := wrError; end; end; end.
分类:
Delphi 与 多线程
, 常用自定义函数、单元
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2008-02-19 WinAPI: waveInClose - 关闭指定的波形输入设备
2008-02-19 WinAPI: waveInAddBuffer - 向波形输入设备发送一个输入缓冲区
2008-02-19 动画演示 Delphi 2007 IDE 功能[2] - 定义变量
2008-02-19 颜色转换函数: 从 Delphi 到 Html
2008-02-19 Delphi 中的颜色常量及效果图
2008-02-19 动画演示 Delphi 2007 IDE 功能[1] - 建立工程、添加控件