最近想到使用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();//设置定时器1set_timer_timing(st1, 400);//定时400msset_timer_trigger_func(st1, test_func1);//定时触发函数//设置定时器2set_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;
}
结果
实现的定时器比较简单,没有对调用函数参数的支持