关于TIMER

讨论之前,我们先了解几点东西,创建一个定时器,要调用SetTimer函数:

function SetTimer(hWnd: HWND;nIDEvent: UINT;uElapse: UINT;lpTimerFunc: TFNTimerProc):UINT;stdcall;

参数hWnd,是程序拥有的窗口句柄。

nIDEvent,定时器的编号,可为大于0或小于2^32-1的任意整数,对于使用同一个窗口句柄的所有定时器来说,编号必须唯一。

uElapse,每次触发的时间间隔,单位为毫秒。

lpTimerFunc,触发时所调用的回调函数地址,如果你使用窗口消息的触发方式,传入NIL即可!

如果成功则返回定时器编号,失败则返回0。

WM_TIMER 传递的消息结构如下:

 

TWMTimer = record

  Msg: Cardinal;        //  消息编号

  TimerID: Longint;      //  定时器编号

  TimerProc: TFarProc;    //  回调函数

  Result: Longint;    //  返回值

end;

 

每当定时器触发时,系统会产生一个WM_TIMER 消息到拥有该窗体线程的消息队列,当消息循环中的DispatchMessage遇到WM_TIMER 时,会进行特别处理,检查它的创建函数的第四个参数是否为NIL。如果TimeProc为NIL,此时DispatchMessage会象处理正常消息一样,调用窗口的窗口过程,把WM_TIMER 交给该窗口过程处理。如果TimeProc不为NIL,则此时DispatchMessage直接调用TimeProc。

WM_RIMER和WM_PAINT一样,都是属于低优先权的窗口消息,只有在消息队列没有其它消息的时候,这两个消息才会被取出处理。另外还有一个特性,一个消息队列绝不会含有多于一个的WM_RIMER或WM_PAINT。比如说上次的WM_RIMER还没处理完,则新的WM_RIMER就不会进入消息队列。

补充一点,定时器用完时要记得释放,即便是程序结束时会自动释放所有的资源,最好还是养成自己主动清理的习惯。关闭定时器,调用KILLTIMER函数就可以了!

function KillTimer(hwnd: HWND;uIDEvent: UINT): BOOL;

第一个参数创建时所传入的窗口句柄,第二个参数是定时器的编号。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值