diff --git a/src/core/service_manager.rs b/src/core/service_manager.rs index a877987..48d6e78 100644 --- a/src/core/service_manager.rs +++ b/src/core/service_manager.rs @@ -358,9 +358,12 @@ impl ServiceManager { self.running = true; while self.running { - let envelope = match self.rx.recv() { + // 使用 recv_timeout 而非 recv,确保外部信号(如 Ctrl+C 置 running=false) + // 能在超时后被检查到,避免永久阻塞等待下一条消息。 + let envelope = match self.rx.recv_timeout(std::time::Duration::from_millis(200)) { Ok(env) => env, - Err(_) => { + Err(mpsc::RecvTimeoutError::Timeout) => continue, + Err(mpsc::RecvTimeoutError::Disconnected) => { println!("[ServiceManager] 所有发送端已关闭,退出"); break; } @@ -763,6 +766,7 @@ impl ServiceManager { Message::Shutdown => { println!("[ServiceManager] 收到 Shutdown 指令"); self.broadcast_message(Message::Shutdown); + self.running = false; } Message::WifiResult(payload) => { self.broadcast_message(Message::WifiResult(payload)); diff --git a/src/main.rs b/src/main.rs index e62c8b8..5562f84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -113,10 +113,17 @@ fn main() -> Result<()> { // 设置 Ctrl+C 信号处理 let running = Arc::new(AtomicBool::new(true)); let r = running.clone(); + let shutdown_tx = manager.sender(); ctrlc::set_handler(move || { println!("\n收到退出信号,正在关闭..."); r.store(false, Ordering::SeqCst); + // 注入 Shutdown 消息,唤醒主消息循环并触发优雅停机 + let _ = shutdown_tx.send(showen_v2::core::message::Envelope { + from: "signal".to_string(), + to: showen_v2::core::message::Destination::Manager, + message: showen_v2::core::message::Message::Shutdown, + }); })?; println!("启动所有插件...");