- 论坛徽章:
- 36
|
本帖最后由 cokeboL 于 2017-07-27 09:56 编辑
回复 14# yulihua49
我喜欢偷懒,用multimap搞的玩具
- Timer.Timers是这个 std::multimap<uint64_t, TimerData> Timers;
- uint64_t Time::Now() {
- struct timeval tv;
- gettimeofday(&tv, 0);
- return uint64_t(tv.tv_sec) * 1000 + uint64_t(tv.tv_usec / 1000);
- }
- uint64_t Time::After(uint64_t now, uint64_t after) {
- assert(after > 0);
- if (!now) {
- return Time::Now() + after;
- }
- return now + after;
- }
- TimerID Timer::NewTimer(uint64_t timeout, TimerCallback callback, void *data, uint64_t now) {
- TimerData timerdata(callback, data);
- uint64_t expire = Time::After(now, timeout);
- TimerID timerid = this->Timers.insert(std::make_pair(expire, timerdata));
- return timerid;
- }
- void Timer::DeleteTimer(TimerID timerid) {
- this->Timers.erase(timerid);
-
- }
- uint64_t Timer::NextTimeout(uint64_t now) {
-
- if (this->Timers.empty()) {
- return WAIT_FOREVER;
- }
- if (!now) {
- now = Time::Now();
- }
- if (this->Timers.begin()->first <= now){
- return 0;
- }
- return this->Timers.begin()->first - now;
- }
- void Timer::CheckTimers(uint64_t now) {
- if (!now) {
- now = Time::Now();
- }
- for (TimerID it = this->Timers.begin(); it != this->Timers.end(); ) {
- if (it->first <= now) {
- TimerCallback callback = it->second.Callback;
- void *data = it->second.Data;
- it++;
- //this->Timers.erase(it++);
- callback(data);
- }
- else {
- break;
- }
- }
- for (TimerID it = this->Timers.begin(); it != this->Timers.end();) {
- if (it->first <= now) {
- this->Timers.erase(it++);
- }
- else {
- break;
- }
- }
- size_t n = this->Timers.size();
- }
- void Timer::Clear() {
- this->Timers.clear();
- }
复制代码
|
|