myTimer.h
#ifndef MY_TIMER_H
#define MY_TIMER_H
#include <signal.h>
#include <time.h>
#ifdef __cplusplus
extern "C"{
#endif
/**
* @brief 定时器回调函数
*
* @param sig 信号的值
* @param si 包函附加信息的结构siginfo, 其中si->si_value.sival_ptr中为创建定时器传入的参数(当传入参数为NULL时,此值为timer_id)
* @param uc 为空
*/
typedef void (*timer_handler_t)(int sig, siginfo_t *si, void *uc);
/**
* @brief 创建定时器(单次定时)
*
* @param timer_id 定时器id
* @param ms 定时时间,单位为毫秒(ms)
* @param timer_handler 定时器回调函数,定时时间到后自动执行
* @param ptr 传给timer_handler的参数,可在回调函数中使用si->si_value.sival_ptr取回(当ptr为NULL时,会传入timer_id)
* @return int 成功:0 失败:-1
*/
int my_timer_create(timer_t *timer_id, int ms, timer_handler_t timer_handler, void *ptr);
/**
* @brief 设置定时器时间
*
* @param timer_id 定时器id
* @param ms
* @return int 成功:0 失败:-1
*/
int my_timer_settime(timer_t timer_id, int ms);
/**
* @brief 获取定时器剩余时间
*
* @param timer_id 定时器id
* @param ms
* @return int 成功:0 失败:-1
*/
int my_timer_gettime(timer_t timer_id, int *ms);
/**
* @brief 删除定时器
*
* @param timer_id 定时器id
* @return int 成功:0 失败:-1
*/
int my_timer_delete(timer_t timer_id);
#ifdef __cplusplus
}
#endif
#endif
myTimer.cpp
#include <stdio.h>
#include <stdlib.h>
#include "myTimer.h"
#include <QDebug>
int my_timer_create(timer_t *timer_id, int ms, timer_handler_t timer_handler, void *ptr)
{
struct sigevent sev;
struct sigaction sa;
// if(timer_id != NULL)
// {
// perror("timer_id is not NULL when create timer");
// return -1;
// }
// 设置定时器信号回调函数
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if(sigaction(SIGRTMIN, &sa, nullptr) < 0)
{
perror( "sigaction error" );
return -1;
}
// 创建定时器
sev.sigev_signo = SIGRTMIN;
sev.sigev_notify = SIGEV_SIGNAL;
if(ptr == nullptr)
sev.sigev_value.sival_ptr = timer_id;
else
sev.sigev_value.sival_ptr = ptr;
if(timer_create(CLOCK_REALTIME, &sev, timer_id) < 0)
{
perror( "timer create error" );
return -1;
}
// 设置定时器时间
if(my_timer_settime(*timer_id, ms) < 0)
return -1;
printf("---sig is=%d\n", SIGRTMIN);
printf("---create timer success!\n");
return 0;
}
int my_timer_settime(timer_t timer_id, int ms)
{
struct itimerspec its;
if(timer_id == nullptr)
{
perror("timer_id is NULL");
return -1;
}
its.it_value.tv_sec = ms / 1000;
its.it_value.tv_nsec = ms % 1000 * 1000000;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
if (timer_settime(timer_id, 0, &its, nullptr) < 0)
{
perror("settime error");
return -1;
}
return 0;
}
int my_timer_gettime(timer_t timer_id, int *ms)
{
struct itimerspec its;
if(timer_id == nullptr)
{
perror("timer_id is NULL");
return -1;
}
if(timer_gettime(timer_id, &its) < 0)
{
perror("get time error");
return -1;
}
*ms = static_cast<int>(its.it_value.tv_sec * 1000 + its.it_value.tv_nsec / 1000000);
return 0;
}
int my_timer_delete(timer_t timer_id)
{
if(timer_id == nullptr)
{
perror("timer_id is NULL");
return -1;
}
if(timer_delete(timer_id) < 0)
{
perror("delete timer error");
return -1;
}
return 0;
}
网友评论