boost.asio定时器dealine_timer,实现可以随时控制启动停止和设置时间。

时间:2021-06-21 23:31:44
dealine_timer类的成员函数
![这里写图片描述](https://img-blog.csdn.net/20150317163110237)
定时器dealine_timer有两种形式的构造函数,都要求有一个io_service对象,用于提交IO请求,第二个参数是定时器的终止时间,可以是posix_time的绝对时间点或者是自当前时间开始的一个时间长度。
一旦定时器对象创建,它就立即开始计时,可以使用成员函数wait()来同步等待定时器终止,或者使用async_wait()异步等待,当定时器终止是会调用handler函数。
如果创建定时器时不指定终止时间,那么定时器不会工作,可以用成员函数expires_at()和expires_from_now()分别设置定时器终止绝对时间和相对时间,然后调用wait()和async_wait()等待。这两个函数也可以用与获得定时器的终止时间,只需要使用它们的无参重载形式。
定时器还有一个cancel()函数,它的功能是通知所有的异步操作取消,转而等待定时器终止。
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream>

class MyTimer
{

public:
    template<typename F>
    MyTimer(boost::asio::io_service& ios, F func, int interval, bool start = true) :
        m_func(func),
        m_interval(interval),
        m_timer(ios, boost::posix_time::millisec(interval)), 
        m_flag(start)
    {
        m_timer.async_wait(boost::bind(&MyTimer::call_func, this, boost::asio::placeholders::error));
    }
    void call_func(const boost::system::error_code&)
    {
        if (!m_flag)
        {
            return;
        }
        m_func();
        m_timer.expires_at(m_timer.expires_at() + boost::posix_time::millisec(m_interval));
        m_timer.async_wait(boost::bind(&MyTimer::call_func, this, boost::asio::placeholders::error));
    }
    void stop()
    {
        m_flag = false;
    }
    void start(int new_interval)
    {
        m_flag = true;
        m_interval = new_interval;
        m_timer.expires_from_now(boost::posix_time::millisec(m_interval));
        m_timer.async_wait(boost::bind(&MyTimer::call_func, this, boost::asio::placeholders::error));
    }
private:
    boost::function<void()> m_func;
    int m_interval;
    boost::asio::deadline_timer m_timer;
    bool m_flag;
};
void print1()
{
    std::cout << "11111" << std::endl;
}
void print2()
{
    std::cout << "22222" << std::endl;
}
boost::asio::io_service ios;
MyTimer at1(ios, print1,500);
MyTimer at2(ios, print2,500);
void threadfun()
{
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    at2.stop();
    boost::this_thread::sleep(boost::posix_time::milliseconds(2000));
    at2.start(1000);
    boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
    at1.stop();
    at2.stop();
}

int main()
{
    boost::thread_group thr_grp;
    thr_grp.create_thread(std::bind(threadfun));
    ios.run();
    getchar();
    return 0;
}

输出
boost.asio定时器dealine_timer,实现可以随时控制启动停止和设置时间。
两个定时器创建施就开始计时,每500毫秒,执行给定的函数。在线程开始时,睡了1秒所以两个定时器各执行了两遍;之后停止了定时器at2的运行,睡了2秒,所以定时器at1执行了4次;之后又开始启动定时器at2,并设置间隔时间为1秒,而定时器at1的间隔时间还是500毫秒,所以,每定时器at1执行了两遍,at2定时器执行一遍。

参考《Boost程序库完全开发指南》