美文网首页
myTimer库

myTimer库

作者: 锋之律 | 来源:发表于2019-10-15 09:41 被阅读0次

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;
}

相关文章

网友评论

      本文标题:myTimer库

      本文链接:https://www.haomeiwen.com/subject/gbujmctx.html