上代码
EventLoop::EventLoop()
timerQueue_(new TimerQueue(this)),
}
EventLoop内置了一个定时器队列timerQueue_
定时器任务
TimerId EventLoop::runAt(const Timestamp& time, const TimerCallback& cb)
{
return timerQueue_->addTimer(cb, time, 0.0);
}
看看TimeQueue的构造函数声明
class TimerQueue : boost::noncopyable
{
explicit TimerQueue(EventLoop* loop);
};
传递了一个EventLoop进去,可以猜测定时任务是在EventLoop里面执行的
看看TimerQueue的构造函数实现
TimerQueue::TimerQueue(EventLoop* loop)
: loop_(loop),
timerfd_(createTimerfd()),
timerfdChannel_(loop, timerfd_)
{
timerfdChannel_.setReadCallback(
boost::bind(&TimerQueue::handleRead, this));
}
不出所料,创建了timerfd_
和timerfdChannel_
,有回调函数是handleRead
那应该在handleRead
调用定时任务
void TimerQueue::handleRead()
{
readTimerfd(timerfd_, now);
//.........
for (std::vector<Entry>::iterator it = expired.begin();
it != expired.end(); ++it)
{
it->second->run();
}
}
这个run()其实是Timer::run()
,
class Timer
{
void run() const
{
callback_();
}
}
打赏
如果这篇文章解决了您的问题,让我买根烟抽抽。
支付宝.jpg 微信.jpg
网友评论