前言
在Windows下,定时器通常用于周期性地执行某些任务或在一定延迟后执行特定的操作。Windows提供了一些API函数来操作定时器,其中主要包括 SetTimer、KillTimer 和 SetTimerProc。
什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
1、SetTimer用于创建一个定时器
SetTimer: 这个函数用于创建一个定时器,并指定定时器的时间间隔。其原型为:
UINT_PTR SetTimer( HWND hWnd, // 窗口句柄,指定定时器消息将发送到的窗口 UINT_PTR nIDEvent, // 定时器的标识符,用于标识定时器 UINT uElapse, // 定时器的时间间隔(毫秒) TIMERPROC lpTimerFunc // 指向定时器过程函数的指针,可选 );
讯享网
hWnd:指定定时器消息将发送到的窗口句柄,如果为 NULL,则定时器消息会被发送到创建定时器时当前活动的窗口。nIDEvent:定时器的标识符,用于在定时器消息中区分不同的定时器。uElapse:定时器的时间间隔,以毫秒为单位。lpTimerFunc:指向定时器过程函数的指针,可选参数。如果指定了此参数,系统会在定时器超时时调用此函数。- 当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是OnTimer函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成OnTimer函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成OnTimer函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。
2、KillTimer: 用于销毁一个指定的定时器
KillTimer: 用于销毁一个指定的定时器。其原型为:
讯享网BOOL KillTimer( HWND hWnd, // 窗口句柄,指定要销毁其定时器的窗口 UINT_PTR uIDEvent // 要销毁的定时器的标识符 );
hWnd:指定要销毁其定时器的窗口句柄。uIDEvent:要销毁的定时器的标识符,与 SetTimer 中的 nIDEvent 相对应。
3、TIMERPROC:用于处理定时器消息
TIMERPROC: 这是一个定时器过程函数,用于处理定时器消息。其原型为:
void CALLBACK TimerProc( HWND hwnd, // 窗口句柄,接收定时器消息的窗口 UINT uMsg, // 消息类型,通常为 WM_TIMER UINT_PTR idEvent, // 定时器的标识符,与 SetTimer 中的 nIDEvent 相对应 DWORD dwTime // 系统时间,定时器超时时的系统时间 );
hwnd: 接收定时器消息的窗口句柄。uMsg: 消息类型,通常为 WM_TIMER。idEvent: 定时器的标识符,与 SetTimer 中的 nIDEvent 相对应。dwTime: 系统时间,定时器超时时的系统时间。
4、示例
讯享网#include <Windows.h> #define TIMER_ID 1 #define POLL_INTERVAL 1000 // 定时器轮询间隔(毫秒) // 初始化静态成员变量 UINT_PTR CXinYouLoginDlg::g_TimerID = 0; //bool CXinYouLoginDlg::g_Condition = false; VOID CALLBACK CXinYouLoginDlg::TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
TRACET(); //if (g_Condition) //{
// // 在条件为true时执行轮询的功能 // std::cout << "Polling..." << std::endl; //} //这个接口里面实现向认证服务端查询用户是否通过心游登录 } void CXinYouLoginDlg::StartTimer(HWND hwnd) {
TRACET(); // 创建定时器,如果定时器已存在,则先删除再重新创建 if (g_TimerID != 0) {
KillTimer(hwnd, TIMER_ID); } //启动定时器 g_TimerID = SetTimer(hwnd, TIMER_ID, POLL_INTERVAL, TimerCallback); if (g_TimerID == 0) {
TRACEE("Error creating timer!"); } } void CXinYouLoginDlg::StopTimer(HWND hwnd) {
TRACET(); // 删除定时器 if (g_TimerID != 0) {
KillTimer(hwnd, TIMER_ID); g_TimerID = 0; } }
5、总结
通过调用 SetTimer 来创建定时器,并在定时器消息的处理函数中执行相应的操作,然后在适当的时候调用 KillTimer 销毁定时器,可以很方便地实现定时执行任务的功能。一旦定时器超时,就会触发 TimerProc 函数。Windows会向指定的窗口发送 WM_TIMER 消息,然后在消息处理过程中调用 TimerProc 函数。这意味着每次定时器超时都会触发 TimerProc 函数的执行。注意:调用SetTimer函数的线程要存在,因为定时器要依赖线程队列来接收消息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/72439.html