java.lang.Object
cn.wjybxx.btree.Task<T>
cn.wjybxx.btree.Decorator<T>
cn.wjybxx.btree.fsm.StateMachineTask<T>
- 所有已实现的接口:
ICancelTokenListener
状态机节点
1.redo和undo是很有用的特性,因此我们在顶层给予支持,但默认的队列不会保存状态。
2.以我的经验来看,状态机是最重要的节点,
Join则是是仅次于状态机的节点 -- 不能以使用数量而定。- 作者:
- wjybxx date - 2023/12/1
-
字段概要
-
构造器概要
构造器 -
方法概要
修饰符和类型方法说明protected void该方法用于初始化对象。final voidcancelCurState(int cancelCode) 对当前当前状态发出取消命令final voidchangeState(Task<T> nextState) 切换状态 -- 如果状态机处于运行中,则立即切换voidchangeState(Task<T> nextState, ChangeStateArgs changeStateArgs) 切换状态 1.如果当前有一个待切换的状态,则会被悄悄丢弃(todo 可以增加一个通知) 2.无论何种模式,在当前状态进入完成状态时一定会触发 3.如果状态机未运行,则仅仅保存在那里,等待下次运行的时候执行 4.当前状态可先正常完成,然后再切换状态,就可以避免进入被取消状态;可参考ChangeStateTaskprotected final ChangeStateArgscheckArgs(ChangeStateArgs changeStateArgs) 检测正确性和自动初始化;不可修改掉cmd丢弃未切换的临时状态protected voidexecute()Task的心跳方法,在Task进入完成状态之前会反复执行。protected voidexit()该方法在Task进入完成状态时执行 1.该方法与Task.enter(int)对应,通常用于停止Task.enter(int)中启动的逻辑。static <T> StateMachineTask<T> findStateMachine(Task<T> task) 查找task最近的状态机节点 1.仅递归查询父节点和长兄节点 2.优先查找附近的,然后测试长兄节点 - 状态机作为第一个节点的情况比较常见static <T> StateMachineTask<T> findStateMachine(Task<T> task, String name) 查找task最近的状态机节点 1.名字不为空的情况下,支持从兄弟节点中查询 2.优先测试父节点,然后测试兄弟节点获取当前状态getName()int开放以允许填充获取临时的下一个状态开放以允许填充protected final booleanprotected final voidnotifyChangeState(Task<T> curState, Task<T> nextState) protected voidonChildCompleted(Task<T> child) 子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.Task.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.Task.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖Task.onChildRunning(Task)的影响。protected final void查看redo对应的state查看undo对应的statefinal boolean重新进入到下一个状态final booleanredoChangeState(ChangeStateArgs changeStateArgs) 重新进入到下一个状态void重置任务以便重新启动(清理运行产生的所有临时数据)voidsetInitState(Task<T> initState) voidsetInitStateProps(Object initStateProps) voidsetListener(StateMachineListener<T> listener) voidvoidsetNoneChildStatus(int noneChildStatus) setRedoQueueSize(int maxSize) voidsetStateMachineHandler(StateMachineHandler<T> stateMachineHandler) setUndoQueueSize(int maxSize) final boolean撤销到前一个状态final booleanundoChangeState(ChangeStateArgs changeStateArgs) 撤销到前一个状态从类继承的方法 cn.wjybxx.btree.Decorator
addChildImpl, childStream, getChild, getChild, getChildCount, indexChild, onChildRunning, onEventImpl, removeChildImpl, setChild, setChildImpl, stopRunningChildren从类继承的方法 cn.wjybxx.btree.Task
addChild, canHandleEvent, checkCancel, enter, getBlackboard, getCancelToken, getControl, getControlData, getCurFrame, getEnterFrame, getEntity, getEntryBlackboard, getExitFrame, getFlags, getGuard, getNormalizedStatus, getPrevStatus, getReentryId, getRunFrames, getSharedProps, getStatus, getTaskEntry, isAutoCheckCancel, isAutoListenCancel, isAutoResetChildren, isCancelled, isCompleted, isDisableDelayNotify, isExecuteTriggeredByEnter, isExecuting, isExited, isExitTriggeredByStop, isFailed, isFailedOrCancelled, isLocked, isNotified, isReentered, isRunning, isSlowStart, isStillborn, isSucceeded, lock, onCancelRequested, onEvent, removeAllChild, removeChild, removeChild, resetChildrenForRestart, resetForRestart, setAutoCheckCancel, setAutoListenCancel, setAutoResetChildren, setBlackboard, setCancelled, setCancelToken, setChild, setCompleted, setControl, setControlData, setDisableDelayNotify, setEnterFrame, setExitFrame, setFailed, setFlags, setGuard, setGuardFailed, setPrevStatus, setSharedProps, setSlowStart, setSuccess, stop, stop, template_checkGuard, template_execute, template_runChild, template_runChildDirectly, template_runHook, template_runHookDirectly, tryLock, unlock, unsetControl
-
构造器详细资料
-
StateMachineTask
public StateMachineTask()
-
-
方法详细资料
-
getCurState
获取当前状态 -
getTempNextState
获取临时的下一个状态 -
discardTempNextState
丢弃未切换的临时状态 -
cancelCurState
public final void cancelCurState(int cancelCode) 对当前当前状态发出取消命令 -
peekUndoState
查看undo对应的state -
peekRedoState
查看redo对应的state -
getUndoQueue
开放以允许填充 -
getRedoQueue
开放以允许填充 -
setUndoQueueSize
- 参数:
maxSize- 最大大小;0表示禁用;大于0启用- 返回:
- 最新的queue
-
setRedoQueueSize
- 参数:
maxSize- 最大大小;0表示禁用;大于0启用- 返回:
- 最新的queue
-
undoChangeState
public final boolean undoChangeState()撤销到前一个状态- 返回:
- 如果有前一个状态则返回true
-
undoChangeState
撤销到前一个状态- 参数:
changeStateArgs- 状态切换参数- 返回:
- 如果有前一个状态则返回true
-
redoChangeState
public final boolean redoChangeState()重新进入到下一个状态- 返回:
- 如果有下一个状态则返回true
-
redoChangeState
重新进入到下一个状态- 参数:
changeStateArgs- 状态切换参数- 返回:
- 如果有下一个状态则返回true
-
changeState
切换状态 -- 如果状态机处于运行中,则立即切换 -
changeState
切换状态 1.如果当前有一个待切换的状态,则会被悄悄丢弃(todo 可以增加一个通知) 2.无论何种模式,在当前状态进入完成状态时一定会触发 3.如果状态机未运行,则仅仅保存在那里,等待下次运行的时候执行 4.当前状态可先正常完成,然后再切换状态,就可以避免进入被取消状态;可参考ChangeStateTaskTask<T> nextState = nextState(); setSuccess(); stateMachine.changeState(nextState)- 参数:
nextState- 要进入的下一个状态changeStateArgs- 状态切换参数
-
checkArgs
检测正确性和自动初始化;不可修改掉cmd -
resetForRestart
public void resetForRestart()从类复制的说明:Task重置任务以便重新启动(清理运行产生的所有临时数据)1. 和exit一样,清理的是运行时产生的临时数据,而不是所有数据;不过该方法是比exit更彻底的清理。 2. 钩子任务也应当被重置。 3. 与
Task.beforeEnter()相同,重写方法时,应先执行父类逻辑,再重置自身属性。 4. 有临时数据的Task都应该重写该方法,行为树通常是需要反复执行的。- 覆盖:
resetForRestart在类中Task<T>
-
beforeEnter
protected void beforeEnter()从类复制的说明:Task该方法用于初始化对象。 1.不命名为init,是因为init通常让人觉得只调用一次。 2.该方法不可以使自身进入完成状态。- 覆盖:
beforeEnter在类中Task<T>
-
exit
protected void exit()从类复制的说明:Task该方法在Task进入完成状态时执行 1.该方法与Task.enter(int)对应,通常用于停止Task.enter(int)中启动的逻辑。 2.该方法也用于清理部分运行时产生的临时数据。 3.一定记得取消注册的各种监听器。 -
execute
protected void execute()从类复制的说明:TaskTask的心跳方法,在Task进入完成状态之前会反复执行。 1.可以根据Task.isExecuteTriggeredByEnter()判断是否是与Task.enter(int)连续执行的。 2.运行中可通过Task.setSuccess()、Task.setFailed(int)()}、Task.setCancelled()将自己更新为完成状态。 3.不建议直接调用该方法,而是通过模板方法运行。 -
onChildCompleted
从类复制的说明:Task子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.Task.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.Task.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖Task.onChildRunning(Task)的影响。 7.任何的回调和事件方法中都由用户自身检测取消信号- 指定者:
onChildCompleted在类中Task<T>
-
onNoChildRunning
protected final void onNoChildRunning() -
isReady
-
notifyChangeState
-
findStateMachine
查找task最近的状态机节点 1.仅递归查询父节点和长兄节点 2.优先查找附近的,然后测试长兄节点 - 状态机作为第一个节点的情况比较常见 -
findStateMachine
查找task最近的状态机节点 1.名字不为空的情况下,支持从兄弟节点中查询 2.优先测试父节点,然后测试兄弟节点 -
getName
-
setName
-
getNoneChildStatus
public int getNoneChildStatus() -
setNoneChildStatus
public void setNoneChildStatus(int noneChildStatus) -
getInitState
-
setInitState
-
getInitStateProps
-
setInitStateProps
-
getListener
-
setListener
-
getStateMachineHandler
-
setStateMachineHandler
-