有时候我们需要在程序里定时地完成一些任务, 比如5秒后发送, 10秒后弹窗之类的操作. 这就需要一个类似于定时器的组件. 这个组件在windows.h里被称为Timer.
设置一个Timer
第一步当然是设置一个Timer了, 在Win32 API里, 没有对象这个概念, 所以别指望像C#一样:
Timer t = new Timer(callback_func); t.start(); /*... ...*/ t.stop();
当然上面只是一个例子, C#也并非真的是这样创建Timer的.
在Win32 API里, 我们使用SetTimer(hwnd, timerID, elapsedMilliSec, callbackFunc)来设置一个定时器, 下面摘抄修改自MSDN:
UINT_PTR WINAPI SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc );参数:
hWnd [HWND]
定时器相关窗口的句柄. 窗口必须是创建定时器的线程所掌控的.nIDEvent [UINT_PTR]
非零Timer标识符.如果此参数是一个已经存在的定时器ID, 此定时器就会替换掉它.
如果此参数不是一个已经存在的定时器ID, 则此参数被忽略并重新生成一个TimerID;
如果不想替换掉Timer, 此参数应当为0并且hWnd参数为NULL.
uElapse [UINT]
定时器超时时间, 以毫秒为单位.如果此参数小于USER_TIMER_MINIMUM (0x0000000A), 则默认使用USER_TIMER_MINIMUM.
如果大于USER_TIMER_MAXIMUM (0x7FFFFFFF), 则默认使用USER_TIMER_MAXIMUM.
lpTimerFunc [TIMERPROC]
超时时执行的函数的指针. 如果此参数为NULL, 系统则会向队列中发送一个WM_USER消息.发送的消息MSG结构体的hwnd成员包含了hWnd参数.
返回值:
如果函数成功了, 返回值为新定时器的ID. 可以使用这个ID来删除这个Timer.
如果函数失败了, 返回值为0, 调用 GetLastError 来获取更多错误信息.注意:
在窗口过程中包含一个WM_TIMER case表啊但是来处理WM_TIMER消息或在创建时使用自定义回调函数.
在创建Timer的线程, 你需要dispatch消息, 即使你使用的是自定义回调函数而不是WM_TIMER.
WM_TIMER的wParam参数即为TimerID - nIDEvent.
Timer的ID, nIDEvent, 是和窗口相关的. 另一个窗口可以有它自己的定时器, 且ID可以与其他窗口的定时器ID相同. 但定时器本身是独一无二的.
在hWnd为NULL的情况下, 本API可以重复使用定时器的ID.