最近想到使用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;
}
结果
实现的定时器比较简单,没有对调用函数参数的支持