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延时。