Magic_Game/core/Tool/Timer.cpp

130 lines
1.8 KiB
C++
Raw Normal View History

2018-09-05 13:17:07 +08:00
#include "..\e2dutil.h"
2017-10-17 21:22:25 +08:00
2018-04-24 09:02:06 +08:00
2018-09-04 22:42:34 +08:00
e2d::Timer * e2d::Timer::GetInstance()
{
2018-08-19 15:11:20 +08:00
static Timer instance;
return &instance;
}
2018-04-24 09:02:06 +08:00
e2d::Timer::Timer()
2018-09-04 22:42:34 +08:00
: tasks_()
2018-04-24 09:02:06 +08:00
{
}
e2d::Timer::~Timer()
{
2017-10-17 21:22:25 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::AddTask(Task * task)
2017-10-17 21:22:25 +08:00
{
if (task)
{
2018-09-04 22:42:34 +08:00
auto iter = std::find(tasks_.begin(), tasks_.end(), task);
if (iter == tasks_.end())
{
2018-09-04 22:42:34 +08:00
task->Retain();
task->last_time_ = Time::Now();
tasks_.push_back(task);
}
}
2017-10-17 21:22:25 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::StopTasks(const String& name)
2017-10-17 21:22:25 +08:00
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
if (task->GetName() == name)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
task->Stop();
2018-04-24 09:02:06 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::StartTasks(const String& name)
2017-10-17 21:22:25 +08:00
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
if (task->GetName() == name)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
task->Start();
2018-04-24 09:02:06 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::RemoveTasks(const String& name)
2017-10-21 19:09:31 +08:00
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
if (task->GetName() == name)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
task->stopped_ = true;
2018-04-24 09:02:06 +08:00
}
}
2017-10-21 19:09:31 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::StopAllTasks()
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
{
2018-09-04 22:42:34 +08:00
task->Stop();
}
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::StartAllTasks()
2017-10-21 19:09:31 +08:00
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
task->Start();
2018-04-24 09:02:06 +08:00
}
2017-10-21 19:09:31 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::RemoveAllTasks()
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
task->stopped_ = true;
2018-04-24 09:02:06 +08:00
}
}
2018-09-04 22:42:34 +08:00
void e2d::Timer::Update()
2018-04-24 09:02:06 +08:00
{
2018-09-04 22:42:34 +08:00
if (tasks_.empty())
2018-04-24 09:02:06 +08:00
return;
2017-10-17 21:22:25 +08:00
2018-08-12 15:38:02 +08:00
std::vector<Task*> currTasks;
2018-09-04 22:42:34 +08:00
currTasks.reserve(tasks_.size());
2018-08-12 15:38:02 +08:00
std::copy_if(
2018-09-04 22:42:34 +08:00
tasks_.begin(),
tasks_.end(),
2018-08-12 15:38:02 +08:00
std::back_inserter(currTasks),
2018-09-04 22:42:34 +08:00
[](Task* task) { return task->IsReady() && !task->stopped_; }
2018-08-12 15:38:02 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& task : currTasks)
2018-09-04 22:42:34 +08:00
task->Update();
2018-08-12 15:38:02 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
for (auto iter = tasks_.begin(); iter != tasks_.end();)
2017-10-21 19:09:31 +08:00
{
2018-09-04 22:42:34 +08:00
if ((*iter)->stopped_)
2018-03-03 17:02:08 +08:00
{
2018-09-04 22:42:34 +08:00
(*iter)->Release();
iter = tasks_.erase(iter);
2018-03-03 17:02:08 +08:00
}
else
{
2018-08-12 15:38:02 +08:00
++iter;
2018-03-03 17:02:08 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
2017-10-21 19:09:31 +08:00
2018-09-04 22:42:34 +08:00
void e2d::Timer::UpdateTime()
2017-10-21 19:09:31 +08:00
{
2018-09-04 22:42:34 +08:00
for (const auto& task : tasks_)
{
2018-09-04 22:42:34 +08:00
task->last_time_ = Time::Now();
2017-10-21 19:09:31 +08:00
}
}