2018-04-21 21:24:46 +08:00
|
|
|
|
#include "..\e2dtool.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-07-05 22:05:23 +08:00
|
|
|
|
{
|
2018-08-19 15:11:20 +08:00
|
|
|
|
static Timer instance;
|
|
|
|
|
|
return &instance;
|
2018-07-05 22:05:23 +08:00
|
|
|
|
}
|
2018-04-24 09:02:06 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
e2d::Timer::Timer()
|
2018-09-04 22:42:34 +08:00
|
|
|
|
: tasks_()
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-04-21 00:46:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
e2d::Timer::~Timer()
|
2018-04-21 00:46:26 +08:00
|
|
|
|
{
|
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
|
|
|
|
{
|
2018-07-05 22:05:23 +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-07-05 22:05:23 +08:00
|
|
|
|
{
|
2018-09-04 22:42:34 +08:00
|
|
|
|
task->Retain();
|
|
|
|
|
|
task->last_time_ = Time::Now();
|
|
|
|
|
|
tasks_.push_back(task);
|
2018-07-05 22:05:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
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-07-05 22:05:23 +08:00
|
|
|
|
{
|
2018-09-04 22:42:34 +08:00
|
|
|
|
for (const auto& task : tasks_)
|
2018-07-05 22:05:23 +08:00
|
|
|
|
{
|
2018-09-04 22:42:34 +08:00
|
|
|
|
task->Stop();
|
2018-07-05 22:05:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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()
|
2017-12-04 11:18:38 +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->stopped_ = true;
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
2017-12-04 11:18:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-04 22:42:34 +08:00
|
|
|
|
void e2d::Timer::ClearAllTasks()
|
2017-10-17 21:22:25 +08:00
|
|
|
|
{
|
2018-09-04 22:42:34 +08:00
|
|
|
|
if (tasks_.empty())
|
2018-07-21 22:57:21 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
2018-09-04 22:42:34 +08:00
|
|
|
|
for (const auto& task : tasks_)
|
2018-02-07 16:37:12 +08:00
|
|
|
|
{
|
2018-09-04 22:42:34 +08:00
|
|
|
|
task->Release();
|
2018-02-07 16:37:12 +08:00
|
|
|
|
}
|
2018-09-04 22:42:34 +08:00
|
|
|
|
tasks_.clear();
|
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::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-11-07 22:20:46 +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_)
|
2017-11-08 15:23:07 +08:00
|
|
|
|
{
|
2018-09-04 22:42:34 +08:00
|
|
|
|
task->last_time_ = Time::Now();
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|