C语言实现定时器,定时触发函数

news2024/11/18 12:42:30

最近想到使用C语言实现一个简单的定时器。使用操作系统windows.h提供的多线程API就能实现
首先定义一个定时器结构体,包含定时时间和触发的函数指针

typedef struct Stimer{
    int valid;//定时器有效
    long timingMS;//定时时间
    TriggerFunc tf;//触发函数
}Stimer;

创建一个线程函数,用来运行定时器

DWORD WINAPI timer_thread(LPVOID lpParam){

    Stimer *st = (Stimer*)lpParam;

    long waitTime = st->timingMS;//获取定时间隔
    TriggerFunc tf = st->tf;//获取触发函数


	do{
		Sleep(waitTime);//休眠
		if(!st->valid){//判断定时器有效性
            break;
		}
        tf();//执行函数
	}while(1);
}

新建定时器的函数

Stimer* new_timer(){

    Stimer *st = malloc(sizeof(Stimer));
    st->valid = 0;
    st->timingMS = 0;
    st->tf = NULL;

    return st;
}

添加函数设置定时器的参数


void set_timer_timing(Stimer* st, long t){
    st->timingMS = t;
}
void set_timer_trigger_func(Stimer* st, TriggerFunc t){
    st->tf = t;
}

通过创建一个线程来运行定时器

void start_timer(Stimer* st){
    if(st->timingMS <= 0 || st->tf == NULL){
        return;
    }else{
        st->valid = 1;
    }
    //创建定时器线程
	DWORD threadID;
	HANDLE hThread = CreateThread(NULL,0,timer_thread,(LPVOID)st,0,&threadID);
}

对于定时器的停止,只需要改变它的有效标志


void stop_timer(Stimer* st){
    st->valid = 0;
}

定时器是动态分配的空间,最后需要添加一个释放定时器的函数


void release_timer(Stimer *st){
    free(st);
}

完整代码
timer.h

#ifndef _TIMER_H_
#define _TIMER_H_

//定义函数指针类型
typedef void(*TriggerFunc)(void);
//定时器结构体
typedef struct Stimer{
    int valid;//定时器有效
    long timingMS;//定时时间
    TriggerFunc tf;//触发函数
}Stimer;
Stimer* new_timer();//新建定时器
void set_timer_timing(Stimer* st, long t);//设置定时器定时时间
void set_timer_trigger_func(Stimer* st, TriggerFunc t);//设置定时器触发函数
void start_timer(Stimer* st);//启动定时器
void stop_timer(Stimer* st);//停止定时器
void release_timer(Stimer *st);//销毁定时器
#endif // _TIMER_H_

timer.c

#include <windows.h>
#include "timer.h"
//定时器线程
DWORD WINAPI timer_thread(LPVOID lpParam){
    Stimer *st = (Stimer*)lpParam;

    long waitTime = st->timingMS;//获取定时间隔
    TriggerFunc tf = st->tf;//获取触发函数


	do{
		Sleep(waitTime);//休眠
		if(!st->valid){//判断定时器有效性
            break;
		}
        tf();//执行函数
	}while(1);
}
Stimer* new_timer(){

    Stimer *st = malloc(sizeof(Stimer));
    st->valid = 0;
    st->timingMS = 0;
    st->tf = NULL;

    return st;
}
void set_timer_timing(Stimer* st, long t){
    st->timingMS = t;
}
void set_timer_trigger_func(Stimer* st, TriggerFunc t){
    st->tf = t;
}
void start_timer(Stimer* st){
    if(st->timingMS <= 0 || st->tf == NULL){
        return;
    }else{
        st->valid = 1;
    }
    //创建定时器线程
	DWORD threadID;
	HANDLE hThread = CreateThread(NULL,0,timer_thread,(LPVOID)st,0,&threadID);
}

void stop_timer(Stimer* st){
    st->valid = 0;
}
void release_timer(Stimer *st){
    free(st);
}

测试

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "timer.h"
//测试函数
void test_func1(){
    puts("Function111 is executed");
}
void test_func2(){
    puts("Function222 is executed");
}
int main(){
    //创建2个定时器
    Stimer *st1 = new_timer();
    Stimer *st2 = new_timer();
    //设置定时器1
    set_timer_timing(st1, 400);//定时400ms
    set_timer_trigger_func(st1, test_func1);//定时触发函数
    //设置定时器2
    set_timer_timing(st2, 600);
    set_timer_trigger_func(st2, test_func2);
    //运行定时器
    getch();
    puts("启动定时器1");
    start_timer(st1);
    getch();
    puts("启动定时器2");
    start_timer(st2);
    getch();
    puts("停止定时器1");
    stop_timer(st1);
    getch();
    puts("停止定时器2");
    stop_timer(st2);

    //销毁定时器
    release_timer(st1);
    release_timer(st2);
    getch();
	return 0;
}

结果
在这里插入图片描述
实现的定时器比较简单,没有对调用函数参数的支持

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

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

相关文章

python下的control库使用

文章目录 control的官方网站函数示例强迫响应forced_response control的官方网站 函数示例 强迫响应forced_response import numpy as np import os import sys import control as ctrl import matplotlib.pyplot as pltdef lim_x(x, lim0):res 0if x > lim:res 1else:…

qt代码练习

计时器练习 namespace Ui { class third; }class third : public QWidget {Q_OBJECTpublic:explicit third(QWidget *parent nullptr);~third();QLabel *labth1 new QLabel(this);QTextEdit *txtth1 new QTextEdit("闹钟",this);QLineEdit *leth1 new QLineEdit(t…

Stable Diffusion:网页版 体验 / AI 绘图

一、官网地址 Stable Diffusion Online 二、Stable Diffusion AI 能做什么 Stable Diffusion AI绘图是一种基于Stable Diffusion模型的生成式AI技术&#xff0c;能够生成各种类型的图像&#xff0c;包括数字艺术、照片增强和图像修复等。以下是一些可能的应用&#xff1a; …

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(13)-Fiddler请求和响应断点调试

1.简介 Fiddler有个强大的功能&#xff0c;可以修改发送到服务器的数据包&#xff0c;但是修改前需要拦截&#xff0c;即设置断点。设置断点后&#xff0c;开始拦截接下来所有网页&#xff0c;直到取消断点。这个功能可以在数据包发送之前&#xff0c;修改请求参数&#xff1b…

【wsl-windows子系统】安装、启用、禁用以及同时支持docker-desktop和vmware方案

如果你要用docker桌面版&#xff0c;很可能会用到wsl&#xff0c;如果没配置好&#xff0c;很可能wsl镜像会占用C盘很多空间。 前提用管理员身份执行 wsl-windows子系统安装和启用 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper…

什么是DOTS?

(图片为实机测试) DOTS全称&#xff1a;&#xff08;Burst Job SystemEntity Component System&#xff09; 新型高性能、多线程面向数据的技术堆栈 是由&#xff1a;BrustJob System ECS组合而成&#xff0c;是一种面向数据对象的编程体系&#xff0c;在unity中您也可以对…

机器学习-Gradient Descent

机器学习(Gradient Descent) videopptblog 梯度下降(Gradient Descent) optimization problem: 损失函数最小化 假设本模型有两个参数&#x1d703;1和&#x1d703;2&#xff0c;随机取得初始值 求解偏微分&#xff0c;梯度下降对参数进行更新 Visualize: 确定梯度方向&…

学习使用axios,绑定动态数据

目录 axios特性 案例一&#xff1a;通过axios获取笑话 案例二&#xff1a;调用城市天气api接口数据实现天气查询案例 axios特性 支持 Promise API 拦截请求和响应&#xff08;可以在请求前及响应前做某些操作&#xff0c;例如&#xff0c;在请求前想要在这个请求头中加一些…

leetcode 1372. 二叉树中的最长交错路径

给你一棵以 root 为根的二叉树&#xff0c;二叉树中的交错路径定义如下&#xff1a; 选择二叉树中 任意 节点和一个方向&#xff08;左或者右&#xff09;。 如果前进方向为右&#xff0c;那么移动到当前节点的的右子节点&#xff0c;否则移动到它的左子节点。 改变前进方向&a…

IIS创建网站报错 \\?\C:\Windows\inetsrv\config\applicationHost.config

现象&#xff1a; IIS创建不了网站&#xff0c;IIS配置没有发生改变 原因&#xff1a; 服务器C盘无空间&#xff0c;释放空间后问题解决。

Java-day03(程序流程控制)

程序流程控制 1.顺序结构 程序从上至下逐行执行&#xff0c;无判断与跳转 public class Test1{ public static void main(String[] args){int i 1;int j i 1; System.out.println(j);} }2.分支结构 依据条件&#xff0c;选择性执行某段语句 主要有以下两种 2.1 i…

计算机毕设 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长…

VSCode搭建GCC环境

1. 下载 https://www.mingw-w64.org/downloads/ https://github.com/niXman/mingw-builds-binaries/releases 2.安装 x86_64-12.2.0-release-win32-seh-rt_v10-rev1.7z解压到D盘 我的电脑–属性–系统属性–环境变量–系统变量–path D:\MinGW-w64\x86_64-12.2.0-release…

用html+javascript打造公文一键排版系统10:单一附件说明排版

如果公文有附件&#xff0c;一般会在公文正文下作附件说明。 一、附件说明的格式 一般为&#xff1a; 公文如有附件&#xff0c;在正文下空一行左空二字编排"附件"二字&#xff0c;后标全角冒号和附件名称。如有多个附件&#xff0c;使用阿拉伯数字标注附件顺序号&…

OSI 7层模型 TCP/IP四层模型 5层模型都是什么,作用是什么【每层的协议没整理完】

7层模型 && 4层TCP/IP 模型对照关系 7层&&5层&&4层模型对照&#xff1a; 我们的教科书为了更好地表示数据包在网络传输上的封装和解封装&#xff0c;抽象出了5层模型 7层模型&#xff1a; 各层的用途&#xff1a; 应用层&#xff1a;为计算机上用户提…

Qt 2. QSerialPortInfo显示串口信息

在ex2.pro 添加&#xff1a; QT serialport//main.cpp #include "ex2.h" #include <QtSerialPort/QtSerialPort> #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Ex2 w;w.show();QList<QSerialPortInfo>…

(二)利用Streamlit创建第一个app——单页面、多页面

1 单页面app Step1&#xff1a;创建一个新的Python脚本。我们称之为uber_pickups.py。 Step2&#xff1a;在您喜爱的IDE或文本编辑器中打开uber_pickups.py&#xff0c;然后添加以下行&#xff1a; import streamlit as st import pandas as pd import numpy as npStep3&…

计算机视觉(五)深度学习基础

文章目录 深度学习基础卷积神经网络与传统神经网络区别深度学习与神经网络的区别 目标函数选择合适的目标函数Softmax层 改进的梯度下降梯度消失的直观解释激活函数学习步长SGD的问题Momentum动量Nesterov MomentumAdagradRMSpropAdam 各种梯度下降算法比较关于算法选择的建议B…

1、Hadoop3.x 从入门到放弃,第一章:概念

Hadoop3.x从入门到放弃&#xff0c;第一章&#xff1a;概念 一、什么是大数据 1、主要解决什么 大数据主要解决&#xff1a;海量数据的“采集”、“存储” 和 "分析计算" 问题2、大数据特点 1> Volume 大量 2> velocity 高速 3> variety 多样性数据分为…

高通死机分析-工具

为了方便高通稳定性领域分析9008以及死机问题&#xff0c;特此写此工具&#xff0c;方便大家分析死机问题&#xff0c;此工具还待完善&#xff0c;后续将发布&#xff0c;有兴趣请联系2251858097qq.com