Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

Windows编程学习笔记(九)

第六章 定时器

 

定时器的原理及使用,在windows程序中的作用,WM_TIMER消息的使用。

/******************************************************************************/

我们都知道,无论是那种语言和程序,定时器功能都是必不可少,他的作用非常广泛,·定时显示·在游戏同步的应用·多媒体播放声音等等,下面就系统的学习windows程序设计中的定时器。

定时器消息不是异步的

定时器使用硬件中断,但WM_TIMER消息不是异步的,wm_timer放在消息队列中,当程序中其他信息执行期间,程序不会受到任何wm_timer消息。

/*********************************************************************************/

 

定时器的使用

有三种方法:

·最简单的方法,就是让定时器发送wm_timer消息到窗口处理程序中,开始计时时使用SetTimer(hwnd,timer_ID,mmsec,NULL);这样程序就会每隔mmsec毫秒收到一个wm_timer消息,使用完后,呼叫KillTimer(hwnd,timer_id)来释放定时器。这用方法有一定的缺陷,就是当窗口处理程序处理别的事情时,有可能不会理会wm_timer消息。

·这种方法是吧wm_timer消息发送到程序的另一个消息处理函数中,这种函数也是用CALLBACK 修饰的,VOID CALLBACK TimerProc(HWND hwnd,UINT msg,UINT timer_id,DWORD wParam);

Hwnd是在呼叫SetTimer时指定的窗口句柄,windows把wm_timer消息发送给TimerProc,因此消息参数是WM_timer,所以当我们启动定时器时,可以这样写:

SetTimer(hwnd,timer_id,mmsec,TimerProc);

KillTimer(hwnd,timer_id);

这样就可以把这个定时器与TimerProc关联起来了。

·第三种方法和第二种方法差不多,只不过hwnd参数设定为NULL,第二个参数ID也被忽略了,例如:

iTimerID= SetTimer(NULL,0,mmsec,TimerProc);

KillTimer(NULL,iTimerID);

这种方法很少使用,只有我们不去明确的说明需要这个定时器的ID,也就是说,我们不去关心ID,而且通常使用一系列的SetTimer时,这种方法是十分有用的。

/***********************************************************************/

 

系统时间

    和定时器十分相关的一个内容就是系统时间,虽然书上没讲,但还是学习一下。

系统时间可以保存在SYSTEMTIME结构中,先看下SYSTEMTIME的定义

typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;

} SYSTEMTIME,
*PSYSTEMTIME;

各个字段的内容显而易见,

wYear

The year (1601 - 30827).

wMonth

The month.

January = 1
February = 2
March = 3
April = 4
May = 5
June = 6
July = 7
August = 8
September = 9
October = 10
November = 11
December = 12

wDayOfWeek

The day of the week.

Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6

wDay

The day of the month (1-31).

wHour

The hour (0-23).

wMinute

The minute (0-59).

wSecond

The second (0-59).

wMilliseconds

The millisecond (0-999).

我们使用函数GetSystemTime来获得系统时间。

SYSTEMTIME sys_time;

GetSystemTime(&sys_time);

posted on 2010-02-03 16:50  Lvpengms  阅读(197)  评论(0编辑  收藏  举报