background image

定时器的使用:三种方法
如果您需要在整个程序执行期间都使用定时器,那么您将得从

WinMain 函数中或者在处理 WM_CREATE 消息时呼

SetTimer,并在退出 WinMain 或响应 WM_DESTROY 消息时呼叫 KillTimer。根据呼叫 SetTimer 时使用

的参数,可以下列三种方法之一使用定时器。
方法一
这是最方便的一种方法,它让

Windows 把 WM_TIMER 消息发送到应用程序的正常窗口消息处理程序中,

SetTimer 呼叫如下所示:

SetTimer (hwnd, 1, uiMsecInterval, NULL) ;        
第一个参数是其窗口消息处理程序将接收

WM_TIMER 消息的窗口句柄。

第二个参数是定时器

ID,它是一个非 0 数值,在整个例子中假定为 1。

第三个参数是一个

32 位无正负号整数,以毫秒为单位指定一个时间间隔,一个 60,000 的值将使 Windows 每分

钟发送一次

WM_TIMER 消息。

您可以通过呼叫
KillTimer (hwnd, 1) ;

方法二
设定定时器的第一种方法是把

WM_TIMER 消息发送到通常的窗口消息处理程序,而第二种方法是让 Windows 直接

将定时器消息发送给您程序的另一个函数。
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;

方法三
设定定时器的第三种方法类似于第二种方法,只是传递给

SetTimer 的 hwnd 参数被设定为 NULL,并且第二个参

数(通常为定时器

ID)被忽略了,最后,此函数传回定时器 ID:

iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;        
如果没有可用的定时器,那么从

SetTimer 传回的 iTimerID 值将为 NULL。

KillTimer 的第一个参数(通常是窗口句柄)也必须为 NULL,定时器 ID 必须是 SetTimer 的传回值:
KillTimer (NULL, iTimerID) ;

--------------------
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);

SDK

 — 

编程笔记

计时器篇两个计时器

API

 

的讨论

SetTimer 函数用于创建一个计时器,KillTimer 函数用于销毁一个计时器。计时器属于系统资源,使用完应及

 

时销毁。

SetTimer

 

的函数原型如下:

UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC 
lpTimerFunc ) ; 

 

其中
hWnd 是和 timer 关联的窗口句柄,此窗口必须为调用 SetTimer 的线程所有;如果 hWnd 为 NULL,没有窗口和

timer 相关联并且 nIDEvent

 

参数被忽略

nIDEvent 是 timer 的标识,为非零值;如果 hWnd 为 NULL 则被忽略;如果 hWnd 非 NULL 而且与 timer 相关
联的窗口已经存在一个为此标识的

timer,则此次 SetTimer 调用将用新的 timer 代替原来的 timer。timer

标识和窗口相关,两个不同的窗口可以拥有

nIDEvent 相同的 tiemr 

uElapse 是以毫秒指定的计时间隔值,范围为 1 毫秒到 4,294,967,295 毫秒(将近 50 天),这个值指示
Windows 每隔多久时间给程序发送 WM_TIMER

 

消息。

lpTimerFunc 是一个回调函数的指针,俗称 TimerFunc;如果 lpTimerFunc 为 NULL,系统将向应用程序队
列发送

WM_TIMER 消息;如果 lpTimerFunc 指定了一个值,DefWindowProc 将在处理 WM_TIMER 消息时调用

这个

lpTimerFunc 所指向的回调函数,因此即使使用 TimerProc 代替处理 WM_TIMER 也需要向窗口分发消息。

 

关于

SetTimer 的返回值:如果 hWnd 为 NULL,返回值为新建立的 timer 的 ID,如果 hWnd 非 NULL,返回一个

0 整数,如果 SetTimer 调用失败则返回 0 

KillTimer 的函数原型为:BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ; 参数意义同
SetTimer