WinAPI: SetTimer、KillTimer - 创建与移除高性能定时器


//创建定时器函数的声明:

SetTimer(

  hWnd: HWND;               {与定时器相关联的窗口句柄}

  nIDEvent: UINT;           {指定一个非 0 的定时器标识符}

  uElapse: UINT;            {指定间隔时间, 单位是毫秒}

  lpTimerFunc: TFNTimerProc {每到时间后, 要调用的函数的指针}

): UINT;                    {返回定时器标识符; 失败返回 0}



//移除定时器函数的声明:

KillTimer(

  hWnd: HWND;    {与定时器相关联的窗口句柄}

  uIDEvent: UINT {定时器标识符}

): BOOL;



//处理 WM_TIMER 消息的回调函数的格式:

TimerProc(

  hWnd: HWND;    {与定时器相关联的窗口句柄}

  uMsg: UINT;    {WM_TIMER 消息}

  idEvent: UINT; {定时器的标识符}

  Time: DWORD    {以世界时间公约格式(UTC)指定的系统时间}

);               {这是个过程, 无返回值}


 
   
应该先理解一下再举例:

SetTimer 的参数1: hWnd, 一般指定 Self.Handle 就可以了;

SetTimer 的参数2: nIDEvent 是某个定时器的标识符, 说明可以创建若干个定时器, 随便给个正整数即可;

SetTimer 的参数3: uElapse, 这相当于 VCL 中 Timer 类的 Interval 属性;

看来参数 1-3 还是非常简单, 不好理解的就是参数4: lpTimerFunc, 这是一个过程的地址.

任意一个过程的地址吗? 当然不是; 这个过程的参数结构是 Windows 系统规定的, 我们必须按规定去定义这个过程; 即使你用不到其中的参数也必须如此.

//举例:

var

  i: Integer;



//先定义回调函数

procedure MyTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD);

begin

  Form1.Text := IntToStr(i);

  Inc(i);

end;



//创建定时器

procedure TForm1.Button1Click(Sender: TObject);

begin

  SetTimer(Handle, 1, 10, @MyTimerProc); {每 1/100 秒调用一次 MyTimerProc}

end;



//删除定时器

procedure TForm1.Button2Click(Sender: TObject);

begin

  KillTimer(Handle, 1); {创建时指定的定时器标识是 1, 这里必须要一致}

end;


 
   
//如果回调过程是窗体类的一个方法, 需要这样: var i: Integer; //先定义回调函数 procedure TForm1.MyTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD); begin Text := IntToStr(i); Inc(i); end; //创建定时器 procedure TForm1.Button1Click(Sender: TObject); begin SetTimer(Handle, 1, 10, @TForm1.MyTimerProc); {每 1/100 秒调用一次 MyTimerProc} end; //删除定时器 procedure TForm1.Button2Click(Sender: TObject); begin KillTimer(Handle, 1); {创建时指定的定时器标识是 1, 这里必须要一致} end;

你可能感兴趣的:(timer)