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

⌚Time: 2023-07-30 23:20:06

👨‍💻Author: Jack Ge

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

}

结果

实现的定时器比较简单,没有对调用函数参数的支持