Magic_Game/core/Tool/Timer.cpp

142 lines
1.9 KiB
C++
Raw Normal View History

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
e2d::Timer * e2d::Timer::instance()
{
2018-08-19 15:11:20 +08:00
static Timer instance;
return &instance;
}
2018-04-24 09:02:06 +08:00
e2d::Timer::Timer()
: _tasks()
2018-04-24 09:02:06 +08:00
{
}
e2d::Timer::~Timer()
{
2017-10-17 21:22:25 +08:00
}
void e2d::Timer::addTask(Task * task)
2017-10-17 21:22:25 +08:00
{
if (task)
{
auto iter = std::find(_tasks.begin(), _tasks.end(), task);
if (iter == _tasks.end())
{
2018-07-22 21:22:27 +08:00
task->retain();
2018-08-12 13:24:31 +08:00
task->_lastTime = Time::now();
_tasks.push_back(task);
}
}
2017-10-17 21:22:25 +08:00
}
2018-08-12 13:24:31 +08:00
void e2d::Timer::stopTasks(const String& name)
2017-10-17 21:22:25 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
2018-04-24 09:02:06 +08:00
{
if (task->name() == name)
2018-04-24 09:02:06 +08:00
{
2018-08-12 13:24:31 +08:00
task->stop();
2018-04-24 09:02:06 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
2018-08-12 13:24:31 +08:00
void e2d::Timer::startTasks(const String& name)
2017-10-17 21:22:25 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
2018-04-24 09:02:06 +08:00
{
if (task->name() == name)
2018-04-24 09:02:06 +08:00
{
2018-08-12 13:24:31 +08:00
task->start();
2018-04-24 09:02:06 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
void e2d::Timer::removeTasks(const String& name)
2017-10-21 19:09:31 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
2018-04-24 09:02:06 +08:00
{
if (task->name() == name)
2018-04-24 09:02:06 +08:00
{
task->_stopped = true;
2018-04-24 09:02:06 +08:00
}
}
2017-10-21 19:09:31 +08:00
}
2018-08-12 13:24:31 +08:00
void e2d::Timer::stopAllTasks()
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
{
2018-08-12 13:24:31 +08:00
task->stop();
}
}
2018-08-12 13:24:31 +08:00
void e2d::Timer::startAllTasks()
2017-10-21 19:09:31 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
2018-04-24 09:02:06 +08:00
{
2018-08-12 13:24:31 +08:00
task->start();
2018-04-24 09:02:06 +08:00
}
2017-10-21 19:09:31 +08:00
}
void e2d::Timer::removeAllTasks()
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
2018-04-24 09:02:06 +08:00
{
task->_stopped = true;
2018-04-24 09:02:06 +08:00
}
}
void e2d::Timer::clearAllTasks()
2017-10-17 21:22:25 +08:00
{
if (_tasks.empty())
return;
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
{
2018-07-22 21:22:27 +08:00
task->release();
}
_tasks.clear();
2018-04-24 09:02:06 +08:00
}
2017-10-17 21:22:25 +08:00
void e2d::Timer::update()
2018-04-24 09:02:06 +08:00
{
2018-08-19 15:11:20 +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-08-12 20:19:47 +08:00
currTasks.reserve(_tasks.size());
2018-08-12 15:38:02 +08:00
std::copy_if(
_tasks.begin(),
_tasks.end(),
std::back_inserter(currTasks),
[](Task* task) { return task->_isReady() && !task->_stopped; }
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& task : currTasks)
task->_update();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto iter = _tasks.begin(); iter != _tasks.end();)
2017-10-21 19:09:31 +08:00
{
2018-08-12 15:38:02 +08:00
if ((*iter)->_stopped)
2018-03-03 17:02:08 +08:00
{
2018-08-12 15:38:02 +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
void e2d::Timer::updateTime()
2017-10-21 19:09:31 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& task : _tasks)
{
2018-08-12 13:24:31 +08:00
task->_lastTime = Time::now();
2017-10-21 19:09:31 +08:00
}
}