Windows下定时器SetTimer以及KillTimer的用法

前言

Windows下,定时器通常用于周期性地执行某些任务或在一定延迟后执行特定的操作。Windows提供了一些API函数来操作定时器,其中主要包括 SetTimerKillTimerSetTimerProc

什么时候我们需要用到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_TIMERUINT_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函数的线程要存在,因为定时器要依赖线程队列来接收消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PaddleOCR基于PPOCRv4的垂类场景模型微调——手写文字识别

PaddleOCR手写文字识别 一. 项目背景二. 环境配置三. 数据构造四. 模型微调五. 串联推理六. 注意事项七. 参考文献 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;ORC是指对包含文本资料的图像文件进行分析识别处理&#xff0c;获取文字…

EXTJS实现自定义表格

宽度自适应 width: 100%, 高度自适应 height: 100% 同时设置表格所处页面高度100% html,body,#griddemo{height: 100%;} 自定义显示的文本内容 Ext.onReady(function () {Ext.QuickTips.init()function sexText(val) {if (val 0) {return <span style"color:green…

【牛客】SQL135 每个6/7级用户活跃情况

描述 现有用户信息表user_info&#xff08;uid用户ID&#xff0c;nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间&#xff09;&#xff1a; iduidnick_nameachievementleveljobregister_time11001牛客1号31007算法2020-01-01 10:00:00210…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

numpy基础运算

numpy基础运算 import numpy as npt1 np.array([1, 2, 3, 4, 5]) # numpy数组类型为numpy.ndarray print("type(np.array)", type(t1)) t2 np.array(range(6)) print("t1:", t1) print("t2:", t2)# np.arange([start,] stop [, stop, ], dtyp…

ChatGPT引领的AI面试攻略系列:AI全栈工程师篇

系列文章目录 AI全栈工程师&#xff08;本文&#xff09; 文章目录 系列文章目录一、前言二、面试题1. 基础理论与数据处理2. 机器学习3. 深度学习4. 大模型与迁移学习5. 计算机视觉6. 自然语言处理&#xff08;NLP&#xff09;7. 多模态学习8. AI生成内容&#xff08;AIGC&am…

QPainter::translate: Painter not active

画笔关联画布 就是这里少写了this指针

亚马逊API:快速获取全球商品详情的实用指南!

亚马逊提供了多种API&#xff0c;允许开发者访问其商品、订单、支付和其他与电商相关的数据。其中&#xff0c;与商品详情相关的API主要是Product Advertising API (PAAPI)。这个API可以帮助你获取亚马逊上的商品详情&#xff0c;如价格、描述、图片等。 以下是使用亚马逊Prod…

Python 基础语法:基本数据类型(一)

1 理解代码与写代码 1.1 什么是代码 代码是现实世界事物在计算机世界中的映射。 我们用计算机写代码&#xff0c;是为了利用计算机的高性能来解决现实世界中的问题。要用计算机来解决现实的问题&#xff0c;首先需要在计算机的世界里面把现实世界的一些事物和问题刻画出来…

05_Mongooes

Mongooes Mongoose是通过Node来操作MongoDB的一个模块。是基于Node.js的第三方模块。 一、Node.js安装 1.解压 2.创建文件夹 解压路径下&#xff0c;创建两个文件夹 node_global&#xff1a;全局安装位置 node_cache&#xff1a;缓存 3.配置 配置环境变量 在path路径…

毫秒生成的时间戳如何转化成东八区具体时间

假设现在有一个时间是1709101071419L 后端代码实现 Java代码&#xff08;东八区时间&#xff09; 在Java代码中&#xff0c;我们将时区从UTC调整为东八区&#xff08;UTC8&#xff09;&#xff1a; import java.time.Instant; import java.time.ZoneId; import java.time.Z…

FreeRTOS操作系统学习——FreeRTOS工程介绍

FreeRTOS工程介绍 核心文件 FreeRTOS的最核心文件只有2个&#xff1a; FreeRTOS/Source/tasks.cFreeRTOS/Source/list.c 文件功能如下图&#xff1a; 头文件相关 内存管理文件 文件在 Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang 下&#xff0c;它也是放…

JavaScript的`call`方法:实现函数间的调用!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

CFD一般步骤-常用的软件

CFD&#xff08;计算流体动力学&#xff09;仿真的具体步骤一般包括以下几个方面&#xff1a; **确定几何形状并生成计算网格&#xff1a;**首先&#xff0c;需要确定要分析的流体流动的空间影响区域&#xff0c;并对实际的几何区域进行简化&#xff0c;以减少计算复杂性。使用…

前端 WebSocket 的一些使用

前端 WebSocket 的一些使用 文章目录 前端 WebSocket 的一些使用连接的建立接收消息发送消息关闭连接处理 WebSocket 是一种网络通信协议&#xff0c;用于实现双向通信。在前端中&#xff0c;你可以使用 JavaScript 中的 WebSocket 对象来创建 WebSocket 连接&#xff0c;发送…

Go语言的设计哲学

Go语言的设计哲学 设计哲学之于编程语言&#xff0c;就好比一个人的价值观之于这个人的行为。简单显式组合并发面向工程 设计哲学之于编程语言&#xff0c;就好比一个人的价值观之于这个人的行为。 因为如果你不认同一个人的价值观&#xff0c;那你其实很难与之持续交往下去&a…

BUUCTF-Misc-[SUCTF 2019]Game1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件一大堆文件&#xff0c;打开index.html时发现一大串base字符 U2FsdGVkX1zHjSBeYPtWQVSwXzcVFZLu6Qm0To/KeuHg8vKAxFrVQ 写代码和工具解都可以 填进去后错误&#xff0c;发现不是真的flag 查看另外一张照片&#xff0c;…

图像AI换脸软件:AI FaceSwap 中文版

AI FaceSwap 是一款利用人工智能技术进行面部交换的软件。该软件通过先进的人工智能算法&#xff0c;能够将一个人的面部表情、神态和特征准确地映射到另一个人身上&#xff0c;实现面部交换的效果。用户只需要提供两张照片&#xff0c;一张是目标人物的照片&#xff0c;另一张…

数据库进阶——如何提升数据库的安全性,以MySQL和Redis加固为例

目录 引出数据库加固加固思路MySQLRedis Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 数据库进阶——如何提升数据库的安全性&#xff0c;以MySQL和Redis加固为例 数据库加固 加固思路 账号配置 应按照用户分配账号&…