| 
									
										
										
										
											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-08-23 16:37:51 +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() | 
					
						
							|  |  |  |  | 	: _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-07-05 22:05:23 +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) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		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(); | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | 			_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
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | 		if (task->getName() == 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
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | 		if (task->getName() == 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
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +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
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | 		if (task->getName() == name) | 
					
						
							| 
									
										
										
										
											2018-04-24 09:02:06 +08:00
										 |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +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-07-05 22:05:23 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 14:30:28 +08:00
										 |  |  |  | 	for (const auto& task : _tasks) | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-12 13:24:31 +08:00
										 |  |  |  | 		task->stop(); | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | void e2d::Timer::removeAllTasks() | 
					
						
							| 
									
										
										
										
											2017-12-04 11:18:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 14:30:28 +08:00
										 |  |  |  | 	for (const auto& task : _tasks) | 
					
						
							| 
									
										
										
										
											2018-04-24 09:02:06 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | 		task->_stopped = true; | 
					
						
							| 
									
										
										
										
											2018-04-24 09:02:06 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-04 11:18:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | void e2d::Timer::clearAllTasks() | 
					
						
							| 
									
										
										
										
											2017-10-17 21:22:25 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-21 22:57:21 +08:00
										 |  |  |  | 	if (_tasks.empty()) | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 14:30:28 +08:00
										 |  |  |  | 	for (const auto& task : _tasks) | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-07-22 21:22:27 +08:00
										 |  |  |  | 		task->release(); | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | 	_tasks.clear(); | 
					
						
							| 
									
										
										
										
											2018-04-24 09:02:06 +08:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-17 21:22:25 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +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-11-07 22:20:46 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-17 21:22:25 +08:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-21 19:09:31 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +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) | 
					
						
							| 
									
										
										
										
											2017-11-08 15:23:07 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-12 13:24:31 +08:00
										 |  |  |  | 		task->_lastTime = Time::now(); | 
					
						
							| 
									
										
										
										
											2017-10-21 19:09:31 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } |