**
定时器简介
**
定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系 统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期 性的自动操作。例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为 1 个 小时,那么每隔 1 个小时系统就会采集一次数据,这样就可以在无人操作的情况下准确的进 行操作。
**
MFC 定时器
**
VS2013 编程中,我们可以使用 MFC 的 CWnd 类提供的成员函数 SetTimer 实现定时 器功能,也可以使用 Windows API 函数 SetTimer 来实现。两者使用方法实际上很类似, 但也有不同。
CWnd 类的 SetTimer 成员函数只能在 CWnd 类或其派生类中调用,而 API 函数 SetTi mer 则没有这个限制,这是一个很重要的区别。因为本教程主要是讲解 MFC 编程,所以这 里就先重点讲解 MFC 定时器的用法.
1、启动定时器。
启动定时器就需要使用CWnd类的成员函数SetTimer。
CWnd::SetTimer的原型如下:
UINT_PTR SetTimer(
UINT nElapse,
( HWND,
UINT,
UINT_PTR,
DWORD )
);
参数 nIDEvent 指定一个非零的定时器 ID;参数 nElapse 指定间隔时间,单位为毫秒; 参数 lpfnTimer 指定一个回调函数的地址,如果该参数为 NULL,则 WM_TIMER 消息被发 送到应用程序的消息队列,并被 CWnd 对象处理。如果此函数成功则返回一个新的定时器 的 ID,我们可以使用此 ID 通过 KillTimer 成员函数来销毁该定时器,如果函数失败则返回 0。
通过 SetTimer 成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过 W M_TIMER 消息的消息响应函数,一种是通过回调函数。
如果要启动多个定时器就多次调用 SetTimer 成员函数。另外,在不同的 CWnd 中可 以有 ID 相同的定时器,并不冲突
2、为 WM_TIMER 消息添加消息处理函数,或者定义回调函数。
如果调用 CWnd::SetTimer 函数时最后一个参数为 NULL,则通过 WM_TIMER 的消息 处理函数来处理定时事件。添加 WM_TIMER 消息的处理函数的方法是,在 VS2010 工程的 Class View 类视图中找到要添加定时器的类,点击右键,选择 Properties,显示其属性页, 然后在属性页工具栏上点击 Messages 按钮,下面列表就列出了所有消息,找到 WM_TIM ER 消息,添加消息处理函数。添加后,cpp 文件中会出现类似如下内容:
1. BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)
2. ......
3. ON_WM_TIMER()
4. END_MESSAGE_MAP()
5.
6. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)
7. {
8. // TODO: Add your message handler code here and/or call def ault
9.
10. CDialogEx::OnTimer(nIDEvent);
11. }
之后就可以在 OnTimer 函数中进行相应的处理了。OnTimer 的参数 nIDEvent 为定时
器 ID,即在 SetTimer 成员函数中指定的定时器 ID,如果有多个定时器,我们可以像下面这 样处理:
1. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)
2. {
3. // TODO: Add your message handler code here and/or call def ault
4. switch (nIDEvent)
5. {
6. case 1:
7. // 如果收到 ID 为 1 的定时器的消息则调用 func1 函数
8. func1();
9. break;
10. case 2:
11. // 如果收到 ID 为 2 的定时器的消息则调用 func2 函数
12. fun2();
13. break;
14. ......
15. default:
16. break;
17. }
18.
19. CDialogEx::OnTimer(nIDEvent);
20. }
如果调用 CWnd::SetTimer 函数时最后一个参数不为 NULL,则需要定义回调函数。回 调函数的形式如下:
C++代码
1. void CALLBACK EXPORT TimerProc(
2.
3. HWND hWnd, // handle of CWnd that called SetTimer
4.
5. UINT nMsg, // WM_TIMER
6.
7. UINT nIDEvent // timer identification
8.
9. DWORD dwTime // system time
10.
11. );
参数 hWnd 为调用 SetTimer 成员函数的 CWnd 对象的句柄,即拥有此定时器的窗口 的句柄;参数 nMsg 为 WM_TIMER,而且总是为 WM_TIMER;参数 nIDEvent 为定时器 I D;参数 dwTime 为系统启动以来的毫秒数,即 GetTickCount 函数的返回值。
这样 CWnd::SetTimer 函数最后一个参数就可以为 TimerProc。
销毁定时器。
不再使用定时器时,可以销毁它。销毁定时器需使用 CWnd 类的 KillTimer 成员函数, CWnd::KillTimer 函数的原型如下:
C++代码
1. BOOL KillTimer(UINT_PTR nIDEvent);
参数 nIDEvent 为要销毁的定时器的 ID,是调CWnd::SetTimer 函数时设置的定时器 ID。如果定时器被销毁则返回 TRUE,而如果没有找到指定的定时器则返回 FALSE。
如果要销毁多个定时器,则多次调用 KillTimer 函数并分别传入要销毁的定时器的 ID。