实现定时器的两种方法:使用windows api定时器 和使用c++11/14 定时器

前言:

当我有一个开发需求,符合下面的条件

1.需要某个任务在程序中每隔一段时间就要执行一次,可能把这个任务封装成了一个函数。

2.这种需要定时执行的任务,有2个,3个....越来越多

这个时候我们就可以考虑使用定时器,把这种任务封装成函数,放进定时器中。每隔一段时间会自动帮我们执行该任务。

1.windows api定时器

主要是使用了两个windows api 函数,来实现定时器的效果

SetTimer函数和KillTimer函数

/** Windows Functions*/WINUSERAPI
UINT_PTR
WINAPI
SetTimer(_In_opt_ HWND hWnd, //窗口句柄_In_ UINT_PTR nIDEvent,//注册的对应任务的ID,_In_ UINT uElapse, //设置的每次执行该回调函数的时间间隔,单位是毫秒_In_opt_ TIMERPROC lpTimerFunc); //注册的对应任务的回调函数,

删除某个定时器里面的任务。

WINUSERAPI
BOOL
WINAPI
KillTimer(_In_opt_ HWND hWnd, // 窗口句柄_In_ UINT_PTR uIDEvent); //对应的定时任务的id

来一个实际的Demo:

#include <iostream>
#include <Windows.h>using namespace std;void CALLBACK Task1(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{cout << "task1" << endl;
}void CALLBACK Task2(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{cout << "task2" << endl;
}void main()
{MSG msg;SetTimer(NULL, 111, 1000, (TIMERPROC)Task1);SetTimer(NULL, 112, 1000, (TIMERPROC)Task2);//消息死循环,一直监听键盘的输入,然后把消息发送到主程序窗口//我们按下ctrl + c的时候,程序会自动停止while (GetMessage(&msg, NULL, NULL, NULL)){if (msg.message == WM_TIMER){TranslateMessage(&msg); //把键盘字符,转换成协议消息DispatchMessage(&msg);//把消息命令发送到主窗口}}KillTimer(NULL, 111);KillTimer(NULL, 112);
}

输出打印结果:

过程说明:

windows主程序中已经帮我们写好了一个定时器的组件。

我们只需要把我们要执行的任务,封装成回调函数。

然后通过SetTimer把这个函数注册进去就行。

通过KillTimer把某个任务删掉就行。

2.c++11/14 实现定时器----简易定时器

有两种定时器:

1.每天的固定时间执行一次任务。

2.间隔一段时候执行一任务。

task_timer.h

#pragma once#include <iostream>
#include <thread>
#include <functional>
#include <ctime>
class TaskTimer {
public:TaskTimer() {};~TaskTimer() {};
private:void ThreadInterval(int interval, std::function<void()> task){while (!stop_sign){task();std::chrono::milliseconds dura(interval);	//间隔几秒std::this_thread::sleep_for(dura);}}void ThreadFixedTime(struct tm time_data, std::function<void()> task){time_t t = time(nullptr);struct tm nowTime;while (!stop_sign){t = time(nullptr);localtime_s(&nowTime, &t);//std::cout << nowTime.tm_hour << " " << nowTime.tm_min << " " << nowTime.tm_sec << " " << std::endl;if (time_data.tm_hour == nowTime.tm_hour && time_data.tm_min == nowTime.tm_min && time_data.tm_sec == nowTime.tm_sec){task();}std::chrono::milliseconds dura(900);	std::this_thread::sleep_for(dura);}}public://添加一个任务间隔一段时间执行一次void AddTaskInterval(int interval, std::function<void()> task){std::thread( &TaskTimer::ThreadInterval, this, interval, task).detach();}//添加一个任务,在每天的固定时间执行void AddTaskFixedTime(struct tm time_data, std::function<void()> task){std::thread(&TaskTimer::ThreadFixedTime, this, time_data, task).detach();}//停止定时器void StopTaskInterval(){stop_sign = true;}private:std::atomic<bool> stop_sign = false;
};

main.cpp

#include <iostream>
#include "task_timer.h"
void func1()
{std::cout << "func1\n" << std::endl;
}void func2()
{std::cout << "func2\n" << std::endl;
}int main(int argc, char* argv[])
{TaskTimer timer;//timer.AddTaskInterval(1000, func1);//timer.AddTaskInterval(1000, func2);struct tm time_data;time_data.tm_hour = 17;time_data.tm_min = 14;time_data.tm_sec = 58;timer.AddTaskFixedTime(time_data, func1);timer.AddTaskFixedTime(time_data, func2);getchar();return 0;
}

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

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

相关文章

第三百七十六回

文章目录 1 .概念介绍2. 实现方法3. 示例代码 我们在上一章回中介绍了在页面之间共传递数据相关的内容&#xff0c;本章回中将介绍如何拦截路由.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 .概念介绍 本章回中介绍的路由拦截是指在路由运行过程中&#xff0c;对路由做…

论文阅读_代码生成模型_CodeLlama

英文名称: Code Llama: Open Foundation Models for Code 中文名称: Code Llama&#xff1a;开放基础代码模型 链接: https://arxiv.org/abs/2308.12950 代码: https://github.com/facebookresearch/codellama 作者: Baptiste Rozire, Jonas Gehring, Fabian Gloeckle, Sten So…

【前端素材】推荐优质在线花卉商城电商网页Flowery平台模板(附源码)

一、需求分析 1、系统定义 在线花卉商城是一个通过互联网提供花卉销售服务的电子商务平台&#xff0c;用户可以在该平台上浏览、选择和购买各种花卉产品。 2、功能需求 在线花卉商城是一个通过互联网提供花卉销售服务的电子商务平台&#xff0c;用户可以在该平台上浏览、选…

vscode在windows环境不能使用终端安装依赖

会报这样的错误提示 解决思路&#xff1a; 1、vscode用管理员打开 (非必须) 2、设置策略 打开 windows powerShell . 输入命令 set-ExecutionPolicy RemoteSigned 然后 Y . 查看是否设置成功 get-executionpolicy 3、下载总是超时&#xff0c;设置镜像源 查看镜像源 npm …

蓝桥杯-天数

//此题属于简单 #include <iostream> using namespace std; int main() { int n; cin>>n; if(n2) { cout<<28; return 0; } if(n1||n3||n5||n7||n8||n10||n12)//一定要记得写成n什么&#xff0c;每个都要写&#xff0c;不要漏掉 { cou…

常见漏洞的流量特征

1、SQL注入漏洞 查看url / Referer字段/User-Agent字段/cookie字段 出现一些特殊字符&#xff08;eg&#xff1a;单引号【‘】、双引号【“”】、括号【&#xff08;&#xff09;】、单引号括号【‘&#xff08;】、双引号括号【“&#xff08;】等一些常见的特殊的字符&#…

数通HCIE和云计算HCIE哪个好一点?

数通是网络的基础知识&#xff0c;也是入门人员必学的方向&#xff0c;相对也会简单些&#xff0c;学习数通&#xff0c;可以很好的学习其他的方向。数通的就业范围也比较广&#xff0c;运营商、企业、政府还是互联网公司&#xff0c;都需要大量的数通工程师来搭建和维护网络&a…

大数据毕业设计之前端04:管理系统为什么要自己实现图标组件

关键字&#xff1a;BuildAdmin、Icon、图标、Vue、ElementUI 前言 说到图标&#xff0c;在BuildAdmin中用到的地方很多。比如上一篇中的折叠图标&#xff0c;还有菜单栏图标、导航菜单栏图标等。常见的图标有&#xff1a;ElementUI图标、font-awesome、iconfont阿里图标以及本…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

云计算 2月21号 (linux文件及用户管理)

一、文件管理 1.1快捷键 编辑命令&#xff1a; Ctrl a &#xff1a;移到命令行首 Ctrl e &#xff1a;移到命令行尾 Ctrl u &#xff1a;从光标处删除至命令行首 Ctrl k &#xff1a;从光标处删除至命令行尾 Ctrl w &#xff1a;从光标处删除至字首 Ctrl d &#x…

20240301-2-ZooKeeper面试题(二)

11. Chroot 特性 3.2.0 版本后&#xff0c;添加了 Chroot 特性&#xff0c;该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot&#xff0c;那么该客户端对服务器的任何操作&#xff0c;都将会被限制在其自己的命名空间下。 通过设置 Chroot&#xff…

Win11远程桌面登陆教程

必备软件 Remote Desktop 这个软件用于便捷操作 Tailscale 这个用于创建虚拟局域网让两台设备处于同一个网段便于远程连接 详细步骤 0、打开电脑设置允许远程连接模式 把这里的开关打开就行。 1、设置允许登陆的用户以及密码 在管理员模式下的宿主电脑上面输入以下命令…

寒假作业Day 02

这是第二天的作业&#xff0c;fighting&#xff01; Day 02 一、选择题 首先char* s[6]是指针数组&#xff0c;也就是其存储的都是这些字符串的地址&#xff0c;其实际上的类型为char**&#xff0c;而fun函数传入了s数组的首地址。而后续fun函数中打印字符&#xff0c;p[i]即…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升&#xff0c;如何设置板框捕捉&#xff1f;_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例&#xff0c;如何精确的放置布局元器件&#xff1f;_哔哩哔哩_bilibili AD绘制PCB…

项目-SERVER模块-Socket模块

Socket模块 一、Socket模块是什么&#xff1f;二、代码实现1.成员变量2.构造、析构函数3.获取套接字文件描述符4.创建套接字5.绑定地址信息6.开始监听连接请求7.向服务器发起连接8.获取新连接9.接收数据10.非阻塞接收数据11.发送数据12.非阻塞发送数据13.关闭套接字14.创建一个…

20240301作业

1.使用fwrite、fread将一张随意的bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fp fopen("./gaoda.bmp","…

Java毕业设计 基于SpringBoot vue 社区团购系统

Java毕业设计 基于SpringBoot vue 社区团购系统 SpringBoot vue 社区团购系统 功能介绍 前端用户: 首页 图片轮播 商品信息 商品分类展示 搜索 商品详情 点我收藏 添加到购物车 立即购买 我要开团 去参团 评论 公告资讯 资讯详情 登录 注册 个人中心 更新信息 点我充值 我的订…

git之远程操作

一.分布式版本控制系统 分布式版本控制系统通常也有⼀台充当“中央服务器”的电脑&#xff0c;但这个服务器的作⽤仅仅是⽤来⽅便“交换”⼤家的修改&#xff0c;没有它⼤家也⼀样⼲活&#xff0c;只是交换修改不⽅便⽽已。有了这个“中央服务器”的电脑&#xff0c;这样就不怕…

ChatGPT学习第四周

&#x1f4d6; 学习目标 ChatGPT实践操作 通过实际操作和练习&#xff0c;加深对ChatGPT功能的理解。 项目&#xff1a;创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目&#xff0c;将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货&#xff01;ChatGPT 从零完…

达梦数据库查询语句内存溢出问题解决

背景&#xff1a;达梦数据库使用过程中&#xff0c;某天突然服务宕机&#xff0c;导致各类后端服务无法注册到nacos上&#xff0c;重启之后nacos正常启动&#xff0c;可执行一条两千多条数据量的连表查询时间很长&#xff0c;甚至会报错&#xff0c;经查看日志发现在查询过程中…