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

最近想到使用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 
#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 
#include 
#include 
#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;
}

结果
C语言实现定时器,定时触发函数_第1张图片
实现的定时器比较简单,没有对调用函数参数的支持

你可能感兴趣的:(c++,c语言,单片机,stm32)