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;
}
输出
两个定时器创建施就开始计时,每500毫秒,执行给定的函数。在线程开始时,睡了1秒所以两个定时器各执行了两遍;之后停止了定时器at2的运行,睡了2秒,所以定时器at1执行了4次;之后又开始启动定时器at2,并设置间隔时间为1秒,而定时器at1的间隔时间还是500毫秒,所以,每定时器at1执行了两遍,at2定时器执行一遍。
参考《Boost程序库完全开发指南》