SetTimer使用在有窗口的情况下, 这种情况大家都会使用。 其实SetTimer也可用在窗口的线程中。 但要注意以下几点:
1. 函数原型:
UINT_PTR SetTimer(
HWND hWnd, //
窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc //
回调函数
);
当 hWnd(窗口句柄) 为NULL时, nIDEvent( 定时器ID)参数也变为无效,系统自动生成一个定时器ID并返回,这时定时器ID 要以返回值为准。所以一般把nIDEvent也设为0.
2. SetTimer需要消息处理来调用你指定的响应函数,所以 如果你的程序中没有消息处理 那就不会调用相关函数。 因没有窗口,所以线程要有自己的处理消息的能力才能成功。如下:
UINT_PTR uID = ::SetTimer(NULL,0,1000,OnTimerProc); MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) //如不想阻塞,可调用PeekMessage函数 { //if (msg.hwnd == NULL && msg.message == WM_TIMER) //该消息就是WM_TIMER消息 // cout << "WM_TIMER"<<endl; TranslateMessage(&msg); DispatchMessage(&msg); } KillTimer(uID);