定时器

          定时器,看上去好象是没什么用的,和键盘和鼠标的功能差的太远了.但其实这是不了解定时器的表现 ,定时器在windows的程序中起到了举足轻重的作用,首先先列下几个定时器的应用:

  1. 操作系统的多任务:操作系统有时候会执行一个非常大的任务,这个任务要完成会占用很多的CPU时间,当然为了完成这个任务而让其他任务等待是不合理的,现代操作系统的多任务都是将一个大的任务分成很多的小模块去分时执行,这个时候定时器就有派上用场了,当每个小模块得到一个WM_TIMER消息的时候,就去执行它,这就实现了任务的分时操作.
  2. 维护一个持续更新的消息:这个不用多解释了.像WINDOWS里面的任务管理器,实时的显示系统的资源利用情况
  3. 终止一个demo版本的程序:比如一个非注册版的FLASHFXP,它只允许你使用50天,50天之后就停止使用了,这个就用到了Timer
  4. 步进动作的同步:比如一个游戏,里面的图象是要按照某个节拍联系前进的,这就要用到定时器,以防止不同的CPU频率带来的节拍不一致.(我觉得这个应该在网络游戏里面用到很多)
  5. 多媒体:一个视频文件,播放的时候音频肯定要和视频同步,这也用到了定时器
  6. 让一个已经退出WIndow procedure的程序重新得到控制.

说完了Timer的用处之后,就来说说Timer的基本概念吧:定时器的频率是从硬件中得来的(具体的和硬件的联系我就不说了,主要是自己硬件学的就不好...lol).在Windows NT中,Timer的最小频率是10msec.要想为自己的程序生成一个定时器就调用:SetTimer(),终止一个定时器就调用KillTimer().

  • WM_TIMER消息被放置在常规的消息队列中,所以虽然定时器每隔一定的时间,比如1S发送一个WM_TIMER,但是如果你的程序在忙于处理其他的消息,那么在这段忙碌的时间里面,程序将接受不到应该传达的WM_TIMER
  • WM_TIMER和WM_PAINT一样,是低优先级消息,所以,只有在消息队列里面没有其他消息的时候,才会执行这两个消息
  • 消息队列里面不会载入多个WM_TIMER.WINDOWS会将消息队列只保留一个WM_TIMER,舍弃其他的WM_TIMER

使用定时器的3种方法:

  1. 方法一是最简单的,这样调用一个Timer:SetTimer (hwnd, 1, uiMsecInterval, NULL) ;终止一个Timer:KillTimer (hwnd, 1) ;第2个参数是要终止的Timer ID.一般为了程序的可读性都用#define来定义定时器的ID....WM_TIMER消息的wParam是定时器的ID,lParam为0.改变一个已经存在的定时器的频率只要重新以相同的ID调用SetTimer()
  2. 方法二是将WM_TIMER发送给一个程序员自己定义的定时器处理函数,而不是消息处理函数,这样只要把方法一的SetTimer的第四个参数改成定时器处理函数的函数名就可以了........................................................SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
  3. 方法三和方法二差不多,只是将SetTimer的第1个参数置NULL,同样的以这种方式得到的定时器发送给TimeProc的WM_TIMER消息的HWND参数也将是NULL.这种方法比较少用,在某些程序需要在不同的时间得到定时器而不需要知道哪些定时器ID已经被使用了.



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值