該類主要服務(wù)于TimerId和TimerQueue這個(gè)兩個(gè)類逼友。
包含了超時(shí)時(shí)間榴嗅,需要執(zhí)行的函數(shù),是否是周期性執(zhí)行赖瞒,周期時(shí)間女揭。 還有一個(gè)是計(jì)時(shí)器序號(hào)
Timer
該類記錄一個(gè)計(jì)時(shí)器,同時(shí)執(zhí)行超時(shí)后的函數(shù)栏饮。
成員變量
- const TimerCallback _cb
該成員記錄了吧兔,超時(shí)以后需要執(zhí)行的函數(shù)。
其中
typedef boost::function<void()> TimerCallback;
- Timestamp _expiration
超時(shí)時(shí)間袍嬉,微秒級(jí)別的境蔼。
因?yàn)槭褂玫?code>timerfd也是個(gè)微秒級(jí)別的 - const bool _repeat
是否是個(gè)周期執(zhí)行的函數(shù)
也就是說,開始執(zhí)行以后伺通,是否每隔多長時(shí)間就執(zhí)行一次的函數(shù) - const double _interval
周期時(shí)間 - const int64_t sequence
每個(gè)計(jì)時(shí)器的一個(gè)標(biāo)志吧箍土。每次的都不重復(fù),每建立一個(gè)就+1
- static AtomicInt64 _s_numCreated;
這個(gè)是一個(gè)原子操作罐监,用來給計(jì)數(shù)器標(biāo)號(hào)的
成員函數(shù)
- 構(gòu)造函數(shù)
構(gòu)造函數(shù)需要記錄超時(shí)時(shí)間吴藻,超時(shí)后執(zhí)行的函數(shù),周期時(shí)間弓柱。周期時(shí)間為0的話沟堡,那么就不周期執(zhí)行
Timer(TimerCallback&& cb, Timestamp when, double interval)
: callback_(std::move(cb)),
expiration_(when),
interval_(interval),
repeat_(interval > 0.0),
sequence_(s_numCreated_.incrementAndGet())
{ }
- void run()
該函數(shù)會(huì)執(zhí)行超時(shí)后執(zhí)行的函數(shù)
void run()
{
_cd();
}
- 三個(gè)返回內(nèi)部數(shù)據(jù)的函數(shù)
當(dāng)計(jì)數(shù)器被調(diào)用以后,需要在來查詢這些參數(shù)矢空,判斷是否再此將該計(jì)數(shù)器添加到時(shí)間隊(duì)列中
Timestamp expiration() const { return _expiration; }
bool repeat() const { return _repeat; }
int64_t sequence() const { return _sequence; }
- void restart(Timestamp now);
重置超時(shí)時(shí)間
當(dāng)計(jì)數(shù)器執(zhí)行以后航罗,需要判斷該計(jì)數(shù)器是否是一個(gè)周期性計(jì)時(shí)器,如果是一個(gè)周期性計(jì)時(shí)器屁药,那么需要重置該計(jì)時(shí)器的超時(shí)時(shí)間粥血,然后再由其他函數(shù)將該計(jì)時(shí)器添加到時(shí)間隊(duì)列中∧鸺‘
如果是一個(gè)周期性函數(shù)复亏,那么需要將超時(shí)時(shí)間設(shè)定為當(dāng)前時(shí)間+周期性執(zhí)行時(shí)間(timerfd_create設(shè)置的是從時(shí)間紀(jì)元開始)
void restart(Timestamp now)
{
if (_repeat)
{
_expiration = addTime(now, _interval);
}
else
{
_expiration = Timestamp::invalid();
}
}
功能
該類,封裝一個(gè)計(jì)時(shí)器缭嫡。