void ExpiryTimerImpl::run()
        {
            auto hasTaskOrStop = [this](){ return !m_tasks.empty() || m_stop; };

            std::unique_lock< std::mutex > lock{ m_mutex };

            while(!m_stop)
            {
                m_cond.wait(lock, hasTaskOrStop);

                if (m_stop) break;

                m_cond.wait_for(lock, remainingTimeForNext());

                executeExpired();
            }
        }
Esempio n. 2
0
TreeNodeStatus ITimedNode::execute(const AIPtr& entity, long deltaMillis) {
	const TreeNodeStatus result = TreeNode::execute(entity, deltaMillis);
	if (result == CANNOTEXECUTE)
		return CANNOTEXECUTE;

	if (_timerMillis == NOTSTARTED) {
		_timerMillis = _millis;
		const TreeNodeStatus status = executeStart(entity, deltaMillis);
		if (status == FINISHED)
			_timerMillis = NOTSTARTED;
		return state(entity, status);
	}

	if (_timerMillis - deltaMillis > 0) {
		_timerMillis -= deltaMillis;
		const TreeNodeStatus status = executeRunning(entity, deltaMillis);
		if (status == FINISHED)
			_timerMillis = NOTSTARTED;
		return state(entity, status);
	}

	_timerMillis = NOTSTARTED;
	return state(entity, executeExpired(entity, deltaMillis));
}