function WaitTimerThreadFun(P: Pointer): Integer; stdcall; var DueTime: Int64; begin with TWaitTimer(P) do begin DueTime := -Int64(Interval)*10000; if SetWaitableTimer(FWaitableTimer, DueTime, Interval, @TimerAPCProc, P, False) then begin SleepEx(INFINITE, True); end else raise EOutOfResources.Create(SNoTimers); end; Result := 0; end;
destructor TWaitTimer.Destroy; begin FEnabled := False; UpdateTimer; CloseHandle(FWaitableTimer); inherited; end;
procedure TWaitTimer.SetEnabled(Value: Boolean); begin if Value <> FEnabled then begin FEnabled := Value; UpdateTimer; end; end;
procedure TWaitTimer.SetInterval(Value: Cardinal); begin if Value <> FInterval then begin FInterval := Value; UpdateTimer; end; end;
procedure TWaitTimer.SetOnTimer(Value: TNotifyEvent); begin FOnTimer := Value;
UpdateTimer; end;
procedure TWaitTimer.Timer; begin if Assigned(FOnTimer) then FOnTimer(Self); end;
procedure TWaitTimer.UpdateTimer; var ID: DWORD; begin CancelWaitableTimer(FWaitableTimer); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then begin CreateThread(nil, 0, @WaitTimerThreadFun, Self, 0, ID); end; end;
end.
[解决办法] 支持,支持,谢谢分享。 [解决办法] 学习学习.. [解决办法] 学习学习.. [解决办法] 来学习下了 [解决办法] 围观一下 [解决办法] 学习了 [解决办法] 学习学习 [解决办法] procedure TWaitTimer.UpdateTimer; var ID: DWORD; begin CancelWaitableTimer(FWaitableTimer); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then begin CreateThread(nil, 0, @WaitTimerThreadFun, Self, 0, ID); end; end;