Winodws中的定时器玩法

SetTimer是一种API函数,位于user32.dll中。你想每隔一段时间执行一件事的的时候,你可以使用它。 使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后Windows以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。不需要指定定时器时,可以调用对应的KillTimer函数销毁指定的时钟。

1 函数如何使用

1.1 用WM_TIMER来设置定时器

SetTimer函数的原型

UINT_PTR SetTimer(

HWND hWnd, //
窗口句柄

UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器

UINT nElapse, // 时间间隔,单位为毫秒

TIMERPROC lpTimerFunc //
回调函数

);

返回值:

类型:UINT_PTR

如果函数成功,hWnd参数为0,则返回新建立的时钟编号,可以把这个时钟编号传递给KillTimer来销毁时钟.

如果函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟.

如果函数失败,返回值是零.若想获得更多的错误信息,调用GetLastError函数.

例如

SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器

在MFC程序中SetTimer被
封装在CWnd类中,调用就不用指定
窗口句柄

于是SetTimer函数的原型变为:

UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))

当使用SetTimer函数的时候,就会生成一个定时器,函数中nIDEvent指的是定时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个
回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的
回调函数,系统默认的是OnTimer函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成OnTimer函数:在ClassWizard里,选择需要计时器的类,添加WM_TIMER消息映射,就自动生成OnTimer函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。

例:

SetTimer(NULL,1,1000,NULL);

NULL 默认是主进程调用

1:计时器的名称;

1000:时间间隔,单位是毫秒;

NULL:使用OnTimer函数。

当不需要计时器的时候调用
KillTimer(nIDEvent);

例如:
KillTimer(1);

1.2 调用回调函数

此方法首先写一个如下格式的回调函数

void CALLBACK
TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);

然后再用SetTimer(1,100,
TimerProc)函数来建一个定时器,第三个参数就是
回调函数地址。

2 加入两个或者两个以上的 timer

继续用SetTimer函数吧,上次的
timer的ID是1,这次可以是2,3,4。。。。

SetTimer(2,1000,NULL);

SetTimer(3,500,NULL);

嗯,WINDOWS会协调他们的。当然OnTimer
函数体也要发生变化,要在函数体内添加每一个
timer的处理代码:

OnTimer(nIDEvent)

{

switch(nIDEvent)

{

case 1:........;

break;

case 2:.......;

break;

case 3:......;

break;

}

}

3 OnceMore

Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果

1、SetTimer定义在哪里?

SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。

SetTimer有两个函数。一个是全局的函数::SetTimer()

UINT SetTimer(

HWND hWnd, // handle of window for
timer messages

UINT nIDEvent, //
timer identifier

UINT uElapse, // time-out value

TIMERPROC lpTimerFunc // address of
timer procedure

);

其中hWnd 是指向CWnd的
指针,即处理Timer事件的
窗口类。说道
窗口类(CWnd),我们有必要来看一下CWnd的继承情况:CWnd有以下子类:CFrameWnd,CDialog,CView,CControlBar等类。这也意味这些类中都可以定义SetTimer事件。

同时,SetTimer()在CWnd中也有定义,即SetTimer()是CWnd的一个成员函数。CWnd的子类可以调用该函数,来设置触发器。

UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );

参数含义:

nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应。这个ID是一个无符号的整型。

nElapse

是指时间延迟。单位是毫秒。这意味着,每隔nElapse毫秒系统调用一次OnTimer()。

void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)

Specifies the address of the application-supplied
TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object。

意思是,指定应用程序提供的
TimerProc回调函数的地址,来处里这个Timer事件。如果是NULL,处理这个Timer事件的定义这个Timer的CWnd对象。他将WM_TIMER消息传递给这个对象,通过实现这个对象的OnTimer()事件来处理这个Timer事件。

所以,一般情况下,我们将这个值设为NULL,有设置该定时器的对象中的OnTimer()函数来处理这个事件。

同样的,我们再看看
KillTimer()和OnTimer()的定义:

KillTimer同SetTimer()一样,他也有两个,一个是全局的::KillTimer(),另一个是CWnd的一个函数。他的声明如下:

//
全局函数

BOOL
KillTimer(

HWND hWnd, // handle of window that installed
timer

UINT uIDEvent //
timer identifier

);

//CWnd函数

BOOL
KillTimer( int nIDEvent );

这两个函数表示的意思是将iD为nIDEVENT的定时器移走。使其不再作用。其用法如同SetTimer()一样。

再看看OnTimer()

CWnd::OnTimer

afx_msg void OnTimer( UINT nIDEvent );

OnTimer()是响应CWnd对象产生的WM_Timer消息。nIDEvent表示要响应TIMER事件的ID。

2 Timer事件的使用:

由以上的分析,我们应该很清楚,如何来使用Timer事件。假定我们在视图上画一个渐变的动画。我们首先在
菜单栏上添加一个菜单项,给这个菜单添加命令响应:

pView->SetTimer(1,1000,NULL);//pView是视图类的指针,这里是在视图类当中设置一个定时器。

添加完毕,再给视图类添加一个WM_Timer事件的响应。在OnTimer()函数中编写函数,进行响应。

Timer的精度:

Timer使用的是时间中断响应计时,windows的时间中断每1/18秒触发一次,所以Timer最低精度约在55ms,低于这个时间则精度不够。

时间: 2024-10-16 14:19:34

Winodws中的定时器玩法的相关文章

javascript中的数字玩法,颠覆你的眼睛

1.JavaScript中的数字中有一些很奇葩的现象. 在Chrome控制台中可以自己做一下实验: 1 === 1.0 ; //true 习惯了强类型语言,如java,c,OC看到这个结论还是有点小迷茫的.这是因为JavaScript内部,所有数字都是以64位浮点数形式存储的,包括正数.它遵循IEEE 754标准. 再看,浮点数的计算. 0.1 + 0.2: 浮点数 发现,0.3 - 0.2 不等于 0.2 - 0.1.所以在做浮点数计算和比较的时候还是要小心的. 对于整数运算,JavaScri

Python 中素数的玩法

质数 质数又称素数.指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数.比1大但不是素数的数称为合数.1和0既非素数也非合数.素数在数论中有着很重要的作用. 质数的分布规律是以36N(N+1)为单位,随着N的增大,素数的个数以波浪形式渐渐增多. 孪生质数也有相同的分布规律. 素数,普遍认为的分布规律是没有规律.时而连续出现,时而又相隔很远很远.有远亲.有近邻,地球对面也还有几个好朋友.素数,真的就没有规律吗?合数可以

openresty+lua在反向代理服务中的玩法

openresty+lua在反向代理服务中的玩法 phith0n · 2015/06/02 10:35 0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了一些邪恶的东西:反代既然是所有流量走我的服务器,那我是不是能够在中途做些手脚,达到一些有趣的目的. openresty是一款结合了nginx和lua的全功能web服务器,我感觉其角色和tornado类似,既是一个中间件,也结合了一个后端解释器.所以,我们可以在nginx上用lua开发很多“有趣”的东

Python中字符串的有趣玩法

反转一个字符串 >>> S = 'abcdefghijklmnop' >>> S[::-1] 'ponmlkjihgfedcba' 这种用法叫做three-limit slices 除此之外,还可以使用slice对象,例如 >>> 'spam'[slice(None, None, -1)] >>> unicode码与字符(single-character strings)之间的转换 >>> ord('s') # or

【转载】总结一下Android中主题(Theme)的正确玩法

http://www.cnblogs.com/zhouyou96/p/5323138.html 总结一下Android中主题(Theme)的正确玩法 在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme">,其中的@style/AppTheme是引用的res/values/styles.xml 中的主题样式,也有可能是引用的 res/values-v11/styles.xml 或者 res/v

[C#] 软硬结合第二篇——酷我音乐盒的逆天玩法

1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下一曲或是找个好听的歌来听...但是,[移动手锁定鼠标-->移动鼠标关闭当前页面选择音乐软件页面-->选择合适的音乐-->恢复原来的界面] 这一过程也会烦人不少,如果说软件的设计要在用户体验上做足功夫,感觉这一点是软件设计人员很难管住的方面,毕竟操作系统也就这样安排的嘛(当然,有些机智的开发人

【精品】北京赛车计划冠军定位玩法技巧

車車是一種投資,我們的目標是:細水長流,見好就收,不求日金千金,只求長期穩定!許多人賠本的原因:1. 資金不足,卻大把下注,跟到第4期不出,錢不夠了,心慌了.有人孤注一擲,衝到第5期中了,嚇的半死.有人不敢跟,第5期出號了,氣死, 然後再跟新計劃,沒錢了,郁悶死.這兩種做法都不對,既然是以投資的心態做事,就應該計劃好翻倍的本錢,做到99%的穩賺,狀況不對就要及時止損. 看著連續中,就是不敢跟,最後咬牙跟了,馬上挂了.于是開始哭,我運氣咋這麽差.不買就中,一買就挂.相反,有些人專門等挂,一挂就上,

Aircrack除破解WiFi密码外的趣味玩法

Aircrack这种屌爆了的攻击测试套件在网上居然只有用它破解WiFi密码的教程,在这里我来扒个冷门,介绍下这款杀器的其他一些有趣的玩法. 0×00:首先你需要一张usb无线网卡 ifconfig查看可以正常识别,如果不行看这里. 0×01:干坏或者不坏的事情前先修改MAC ifconfig [INTERFACE] down#关闭网卡 #[INTERFACE]是指你的无线网卡,一般为wlan0,下不再说明 macchanger -m [MAC] [INTERFACE]#修改MAC,[MAC]是你

关于摇红包 | 必须知道的几种玩法

逢年过节,搞活动 微信红包,摇一摇 佰睿科技摇摇啦应用平台提供各种摇红包玩法 [玩法一]:摇一摇红包 功能简介:这种玩法与16年春节微信官方搞的摇红包活动功能一样,采用ibeacon蓝牙技术,通过"微信摇一摇周边"入口参与活动,用户打开手机蓝牙,摇一摇即可领取现金红包并且可以强制/默认用户关注公众号,所获得的红包金额直接转入用户零钱包,支持设置固定/随机金额红包,可限定参与活动用户,支持领取红包后自定义广告跳转,可设定中奖概率. 功能特点:优化了用户操作层级,红包金额直接转入用户零钱包