利用linux的timerfd_create实现计时器示例分享

2019-09-23 09:42:46丽君

    timers_poll(int max_num=128)
    {
        active = 1;
        epfd = epoll_create(max_num);
    }

    int timers_poll_add_timer(timer &ptimer);
    int timers_poll_del_timer(timer &ptimer);
    int run();

    int timers_poll_deactive()
    {
        active = 0;
    }

    ~ timers_poll()
    {

    }
private:
    int epfd;
    int active;
    std::map<int, timer> timers_map;
    /* data */
} ;
#endif /* TIMER_POLL_H */

timer_poll.cpp


/*
 * File:   timer_poll.cpp
 * Author: Administrator
 */

#include <cstdlib>
#include "timer_poll.h"

using namespace std;

timer::timer(const timer& ptimer)
{
    timer_internal = ptimer.timer_internal;
    cb = ptimer.cb;
    timer_id = ptimer.timer_id;
    repeat = ptimer.repeat;
    userdata = ptimer.userdata;
}

timer & timer::operator =(const timer& ptimer)
{
    if (this == &ptimer)
    {
        return *this;
    }

    timer_internal = ptimer.timer_internal;
    cb = ptimer.cb;
    timer_id = ptimer.timer_id;
    repeat = ptimer.repeat;
    userdata = ptimer.userdata;
    return *this;
}

int timer::timer_start()
{
    struct itimerspec ptime_internal = {0};
    ptime_internal.it_value.tv_sec = (int) timer_internal;
    ptime_internal.it_value.tv_nsec = (timer_internal - (int) timer_internal)*1000000;
    if(repeat)
    {
        ptime_internal.it_interval.tv_sec = ptime_internal.it_value.tv_sec;
        ptime_internal.it_interval.tv_nsec = ptime_internal.it_value.tv_nsec;
    }

    timerfd_settime(timer_id, 0, &ptime_internal, NULL);
    return 0;
}

int timer::timer_stop()
{
    close(timer_id);
    return 0;
}

int timer::timer_modify_internal(double timer_internal)
{
    this->timer_internal = timer_internal;
    timer_start();
}

int timers_poll::timers_poll_add_timer(timer& ptimer)
{
    int timer_id = ptimer.timer_get_id();
    struct epoll_event ev;
    ev.data.fd = timer_id;