delphi 11 使用 timeSetEventEx
时间: 2023-07-11 21:23:22 浏览: 227
delphi延时函数 动态链接库DLL函数
在Delphi 11中,可以使用timeSetEventEx函数来创建定时器。timeSetEventEx函数接受一个TIMECALLBACK类型的回调函数,并返回一个定时器ID,可用于取消定时器。
下面是一个使用timeSetEventEx函数创建定时器的示例代码:
```
unit TimerEx;
interface
uses
Winapi.Windows, System.SysUtils;
type
TTimerEx = class
private
FTimerID: MMRESULT;
FOnTimer: TProc;
procedure TimerCallback(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); stdcall;
public
constructor Create(Interval: Cardinal; OnTimer: TProc);
destructor Destroy; override;
procedure Stop;
end;
implementation
{ TTimerEx }
constructor TTimerEx.Create(Interval: Cardinal; OnTimer: TProc);
var
te: TIMECAPS;
begin
inherited Create;
if timeGetDevCaps(@te, SizeOf(te)) <> TIMERR_NOERROR then
RaiseLastOSError;
if te.wPeriodMin > Interval then
Interval := te.wPeriodMin;
FOnTimer := OnTimer;
FTimerID := timeSetEventEx(Interval, te.wPeriodMin, @TimerCallback, NativeUInt(Self), TIME_PERIODIC);
if FTimerID = 0 then
RaiseLastOSError;
end;
destructor TTimerEx.Destroy;
begin
Stop;
inherited;
end;
procedure TTimerEx.Stop;
begin
if FTimerID <> 0 then
begin
timeKillEvent(FTimerID);
FTimerID := 0;
end;
end;
procedure TTimerEx.TimerCallback(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
FOnTimer();
end;
end.
```
在使用时,可以通过创建TTimerEx对象来启动定时器:
```
procedure TForm1.FormCreate(Sender: TObject);
begin
TTimerEx.Create(1000, procedure
begin
Label1.Caption := FormatDateTime('hh:nn:ss', Now);
end);
end;
```
需要注意的是,timeSetEventEx函数需要调用timeBeginPeriod函数来设置定时器的最小间隔,否则可能无法正常工作。另外,定时器回调函数必须是stdcall调用约定。
阅读全文