130 lines
1.8 KiB
C++
130 lines
1.8 KiB
C++
#include "..\e2dtool.h"
|
|
|
|
|
|
e2d::Timer * e2d::Timer::GetInstance()
|
|
{
|
|
static Timer instance;
|
|
return &instance;
|
|
}
|
|
|
|
e2d::Timer::Timer()
|
|
: tasks_()
|
|
{
|
|
}
|
|
|
|
e2d::Timer::~Timer()
|
|
{
|
|
}
|
|
|
|
void e2d::Timer::AddTask(Task * task)
|
|
{
|
|
if (task)
|
|
{
|
|
auto iter = std::find(tasks_.begin(), tasks_.end(), task);
|
|
if (iter == tasks_.end())
|
|
{
|
|
task->Retain();
|
|
task->last_time_ = Time::Now();
|
|
tasks_.push_back(task);
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::StopTasks(const String& name)
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
if (task->GetName() == name)
|
|
{
|
|
task->Stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::StartTasks(const String& name)
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
if (task->GetName() == name)
|
|
{
|
|
task->Start();
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::RemoveTasks(const String& name)
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
if (task->GetName() == name)
|
|
{
|
|
task->stopped_ = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::StopAllTasks()
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
task->Stop();
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::StartAllTasks()
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
task->Start();
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::RemoveAllTasks()
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
task->stopped_ = true;
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::Update()
|
|
{
|
|
if (tasks_.empty())
|
|
return;
|
|
|
|
std::vector<Task*> currTasks;
|
|
currTasks.reserve(tasks_.size());
|
|
std::copy_if(
|
|
tasks_.begin(),
|
|
tasks_.end(),
|
|
std::back_inserter(currTasks),
|
|
[](Task* task) { return task->IsReady() && !task->stopped_; }
|
|
);
|
|
|
|
// 遍历就绪的任务
|
|
for (const auto& task : currTasks)
|
|
task->Update();
|
|
|
|
// 清除结束的任务
|
|
for (auto iter = tasks_.begin(); iter != tasks_.end();)
|
|
{
|
|
if ((*iter)->stopped_)
|
|
{
|
|
(*iter)->Release();
|
|
iter = tasks_.erase(iter);
|
|
}
|
|
else
|
|
{
|
|
++iter;
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::Timer::UpdateTime()
|
|
{
|
|
for (const auto& task : tasks_)
|
|
{
|
|
task->last_time_ = Time::Now();
|
|
}
|
|
}
|