diff --git a/events.go b/events.go index b65f9d7..6ebed86 100644 --- a/events.go +++ b/events.go @@ -49,6 +49,12 @@ func (me *EventType[T]) Publish(wd World, event *T) { }) } +// 内部发布事件(同步发布,并直接触发) +func (me *EventType[T]) internalPublish(wd World, event *T) { + me.et.Publish(wd, *event) + processAllEvents(wd) +} + /////////////////////////////////////////////////////////////////////////////////// // 订阅该类型的事件 diff --git a/request.go b/request.go index bd7955b..99a2f20 100644 --- a/request.go +++ b/request.go @@ -30,7 +30,7 @@ func NewErrResult(err error) Result[EmptyType] { // 请求世界执行给定函数 func Request[T any](w World, handler func() Result[T]) chan Result[T] { future := make(chan Result[T]) - w.Execute(func() { + err := w.Execute(func() { result := handler() select { // 即使外面不接收,也不会卡停World运行 @@ -38,5 +38,14 @@ func Request[T any](w World, handler func() Result[T]) chan Result[T] { default: } }) + // 世界执行错误直接响应错误 + if err != nil { + go func() { + select { + case future <- Result[T]{Err: err}: + default: + } + }() + } return future } diff --git a/world.go b/world.go index d3f3a0a..3d118eb 100644 --- a/world.go +++ b/world.go @@ -43,7 +43,7 @@ type ( // 添加系统 AddSystem(sys ...ISystem) // 在世界中执行处理逻辑(在世界运行线程中) - Execute(fn HandleFunc) + Execute(fn HandleFunc) error } // 处理函数 @@ -147,11 +147,10 @@ func (w *world) updateState(state WorldState) { old := w.state slog.Debug("世界状态变更", "oldstate", old, "state", state) w.state = state - WorldStateChangeEvent.Publish(w, &WorldStateChange{ + WorldStateChangeEvent.internalPublish(w, &WorldStateChange{ OldState: old, NewState: state, }) - WorldStateChangeEvent.et.ProcessEvents(w) } } @@ -186,17 +185,24 @@ func (w *world) StartUp() { } // 在世界线程执行逻辑 -func (w *world) Execute(fn HandleFunc) { +func (w *world) Execute(fn HandleFunc) error { + if w.state == WorldError { + return fmt.Errorf("世界运行异常,无法执行请求") + } else if w.state != WorldRunning && w.state != WorldPause { + return fmt.Errorf("世界已经关闭,无法执行请求") + } w.toBeExecuteds <- fn + return nil } // 关闭世界 func (w *world) Close() { if w.state == WorldRunning || w.state == WorldPause { - w.updateState(WorldClose) + w.Execute(func() { + w.updateState(WorldClose) + }) } else if w.state == WorldError { w.updateState(WorldClosed) - w.handleRequestAndEvent() } } @@ -225,6 +231,7 @@ func (w *world) run() { } }() for range w.ticker.C { + slog.Debug("世界运行") if w.state == WorldClose { // 世界正常关闭 w.close() @@ -232,7 +239,6 @@ func (w *world) run() { } // start := time.Now() if w.state != WorldRunning { // 世界非运行状态 - w.handleRequestAndEvent() continue } if w.times >= 1 { @@ -241,7 +247,10 @@ func (w *world) run() { for _, sys := range w.systems { sys.Update(w) } - w.handleRequestAndEvent() + // 执行待执行逻辑 + w.executeTodos() + // 处理所有事件 + processAllEvents(w) } w.times = w.times - float64(times) + w.speed } else { @@ -252,21 +261,13 @@ func (w *world) run() { } } -// 处理请求和事件执行 -func (w *world) handleRequestAndEvent() { - // 执行待执行逻辑 - w.executeTodos() - // 处理所有事件 - processAllEvents(w) -} - // 世界运行异常处理 func (w *world) exception(err any) { - slog.Error("世界出现异常", "error", err) + // slog.Error("世界运行异常", "error", err, "stack", string(debug.Stack())) w.updateState(WorldError) - // // 关闭定时器 - // w.ticker.Stop() - w.handleRequestAndEvent() + // 关闭定时器 + w.ticker.Stop() + // w.handleRequestAndEvent() } // 世界正常关闭逻辑 @@ -275,13 +276,5 @@ func (w *world) close() { w.updateState(WorldClosed) // 关闭定时器 w.ticker.Stop() - go func() { - defer func() { - if err := recover(); err != nil { - slog.Error("世界关闭监听处理可能异常", "error", err) - } - }() - w.handleRequestAndEvent() - }() slog.Debug("世界关闭finish") }