예제 #1
0
void ContinuousExecutor::run() {
	elapsed = 0;
	loops = 0;

	running = true;
	paused = false;

	LOG(LTRACE) << name() << "::run()";

	if (components.count(mk_name) < 1) {
		LOG(LERROR) << "Component " << mk_name << " is not being executed in this thread.\n";
		main_component = NULL;
		return;
	} else {
		main_component = components[mk_name];
	}

	while(running) {
		if (paused) {
			/// \todo sync with mutex
			LOG(LTRACE) << name() << " paused";
			Common::Thread::msleep(50);
			yield();
			continue;
		}

		LOG(LTRACE) << name() << " executing events";
		executeEvents();

		// check if there is any component to execute
		if (main_component && main_component->running()) {
			// check number of iterations
			if (max_iter >= 0) {
				--max_iter;
				if (max_iter < 0)
					break;
			}

			LOG(LTRACE) << name() << " making step (" << main_component->name() << ")";
			elapsed += main_component->step();
			loops++;
			double spl = elapsed/loops;
			double lps = 1.0 / spl;
			LOG(LTRACE) << "Executor " << name() << ": " << loops << " loops in " << elapsed << " seconds (" << spl << "spl = " << lps << "lps)";

		} else {
			Common::Thread::msleep(50);
		}

		yield();
	}
}
예제 #2
0
inline void HexagonGame::updateLevelEvents(float mFrameTime)
{
    scriptsTimeline.update(mFrameTime);
    if(scriptsTimeline.isFinished()) clearAndResetTimeline(scriptsTimeline);

    for(ScriptData& pattern : scripts) pattern.update(mFrameTime);

    if(!getScripting()) return;

    messagesTimeline.update(mFrameTime);
    if(messagesTimeline.isFinished()) clearAndResetTimeline(messagesTimeline);

    executeEvents(levelData.getRoot()["events"], currentTime);
}
예제 #3
0
파일: Sequencer.cpp 프로젝트: eriser/rejuce
void Sequencer::run()
{
	while (!threadShouldExit())
	{
		double start = Time::getMillisecondCounterHiRes();

		// execute all commands
		executeEvents();

		// tick
		tick();

		// wait
		Time::waitForMillisecondCounter(start+PHRASE_DELAY_MSEC(_bpm));
	}

	DBG("sequencer thread exiting");
}
예제 #4
0
void PeriodicExecutor::run() {
	/// Timer used in periodic mode
	Common::Timer timer, main_timer;

	elapsed = 0;
	loops = 0;

	double time_elapsed = 0;
	double to_sleep = interval;

	running = true;

	if (components.count(mk_name) < 1) {
		LOG(LERROR) << "Component " << mk_name << " is not executed in this thread.\n";
		main_component = NULL;
		return;
	} else {
		main_component = components[mk_name];
	}

	timer.restart();
	main_timer.restart();
	while(running) {
		if (paused) {
			/// \todo sync with mutex
			Common::Thread::msleep(50);
			continue;
		}

		executeEvents();

		to_sleep -= timer.elapsed();
		timer.restart();

		if (to_sleep <= 0) {

			// check if there is any component to execute
			if (main_component && main_component->running()) {
				// check number of iterations
				if (max_iter >= 0) {
					--max_iter;
					if (max_iter < 0)
						break;
				}

				elapsed += main_component->step();
				loops++;
				double spl = elapsed/loops;
				double lps = 1.0 / spl;
				LOG(LTRACE) << "Executor " << name() << ": " << loops << " loops in " << elapsed << " seconds (" << spl << "spl = " << lps << "lps)";
			} else {
				Common::Thread::msleep(50);
			}

			time_elapsed += main_timer.elapsed();
			main_timer.restart();

			to_sleep += interval - timer.elapsed();
			timer.restart();
			LOG(LTRACE) << "Thread " << name() << " is going asleep for " << to_sleep;

		}
		try {
			Common::Thread::msleep(to_sleep * 1000);
		}
		catch (const boost::thread_interrupted & ex) {
		}
	}

	double spl = time_elapsed/loops;
	double lps = 1.0 / spl;

	LOG(LNOTICE) << "Executor " << name() << ": " << loops << " loops in " << time_elapsed << " seconds (" << spl << "spl = " << lps << "lps)";
	LOG(LINFO) << "Executor " << name() << " is periodic, actual period was " << spl << " while it should be " << interval << " (" << (spl / interval * 100) << "%)";
}