diff --git a/internal/routes/play/wait_card.go b/internal/routes/play/wait_card.go index 7db570b..2bf0a38 100644 --- a/internal/routes/play/wait_card.go +++ b/internal/routes/play/wait_card.go @@ -10,11 +10,12 @@ import ( "game-driver/pkg/card_reader" "game-driver/pkg/channel" "game-driver/pkg/tts" - "go.uber.org/zap" "io/fs" "os" "sync" "time" + + "go.uber.org/zap" ) func WaitCard(ctx context.Context) leaf.HandlerFunc { @@ -79,13 +80,14 @@ func WaitCard(ctx context.Context) leaf.HandlerFunc { defer cardInfo.Close() // 结束信号通道 - cc, cancel := context.WithCancel(context.TODO()) + // 使用独立 context 确保读卡器监听完整执行,不受外部取消影响 + c2, cancel := context.WithCancel(context.Background()) defer cancel() wait.Add(1) go func() { defer wait.Done() - reader.OnCardInfo(cc, func(info *card_reader.CardInfo) { + reader.OnCardInfo(c2, func(info *card_reader.CardInfo) { cardInfo.Send(info.ID) }) }() diff --git a/internal/routes/standby_ctrl/cron.go b/internal/routes/standby_ctrl/cron.go index 9907a02..c4f1a3b 100644 --- a/internal/routes/standby_ctrl/cron.go +++ b/internal/routes/standby_ctrl/cron.go @@ -65,7 +65,8 @@ func Cron(rootRules []cronrange.Rule, cron string, play func(c context.Context) case r := <-a: if r { if ok := m.TryLock(); ok { - ctx, cc := context.WithCancel(context.TODO()) + // 使用独立 context 确保任务完整执行,不受外部取消影响 + ctx, cc := context.WithCancel(context.Background()) cancel = cc waitGroup.Add(1) go func() { diff --git a/internal/routes/standby_ctrl/interval.go b/internal/routes/standby_ctrl/interval.go index 773bb6c..ee5a976 100644 --- a/internal/routes/standby_ctrl/interval.go +++ b/internal/routes/standby_ctrl/interval.go @@ -28,6 +28,8 @@ func Interval(interval int64, play func(c context.Context) error) func(c context case <-c.Done(): return nil default: + // 避免忙循环,短暂休眠 + time.Sleep(10 * time.Millisecond) } } }