windows编程学习笔记(5)定时器的使用

一.定时器的介绍&使用

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


你可能感兴趣的:(编程,windows,定时器,settimer,winapi)