一.定时器的介绍&使用
windows是事件驱动的操作系统,我们编写windows程序时,当然不能期望它像DOS那样,顺序执行;相反,我们需要随时随地让windows程序接受我们的操作,这里面就是用到第一节所说的消息循环机制,从消息队列里面提取消息,有消息就进行处理。WM_TIMER就是一个很重要的消息,它是由定时器产生的一种消息,下面就介绍一下定时器:
定时器,顾名思义,就是定时器嘛(>_<)就好像我们用的秒表,只不过这个表的精度更广,小到几毫秒,大到几天。使用定时器时,先创建一个定时器,然后定时器就每隔设定的时间,向消息队列里面投递一个WM_TIMER消息,我们只需要在窗口过程函数中对WM_TIMER消息进行处理,就可以达到每隔多长时间,进行一个设定好的操作的目的。在不使用定时器时,关掉定时器,以免占用系统资源。
下面是跟定时器有关的几个函数:
1)创建定时器:
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
2)WndProc函数中对WM_TIMER消息进行处理
3)关闭定时器
KillTimer(nIDEvent)//定时器编号
<span style="white-space:pre"></span>case WM_CREATE:
//设置定时器,编号为1,间隔为1ms,回调函数设为NULL,调用WM_TIMER响应
SetTimer(hwnd, 1, 100, NULL);
break;
//响应定时器
case WM_TIMER:
hdc = GetDC(hwnd);
memset(buffer, 0, 10);
itoa(g_timer_count,buffer, 10);
TextOut(hdc, 100, 100, (LPCWSTR)buffer, strlen(buffer));
ReleaseDC(hwnd, hdc);
g_timer_count++;
if (g_timer_count == 9)
g_timer_count = 0;
break;
二.有关定时器需要注意的几个问题
1.如果有多个定时器怎么办?
可以通过wParam来选择要处理的定时器,wParam中存储的为定时器编号
#define TIMER_SEC 1
#define TIMER_MIN 2
//使用两个SetTimer来设定两个计时器:
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;
SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;
case WM_TIMER:
switch (wParam)
{
case TIMER_SEC:
//每秒一次的处理
break ;
case TIMER_MIN:
//每分钟一次的处理
break ;
}
return 0 ;
2.定时器能保证在规定时间就报时吗?
答:不能,WM_TIMER消息的优先级比较低,设置定时器之后 ,每到一定时间,向消息队列中投递一个WM_TIMER消息,(消息队列中只允许有一个WM_TIMER消息)如果在规定时间内没有处理完其他消息,系统是不会处理WM_TIMER消息的。所以有时候定时器并不一定准确,在处理大量信息时,就有可能造成WM_TIMER延时。