From 8f960dcf48b356cce161c37b4dcc9d1f65df662f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=9A=E5=AD=90?= <40852301+uiYzzi@users.noreply.github.com> Date: Tue, 4 Mar 2025 12:13:27 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=A8=8B=E5=BA=8F=E5=90=8E=20aria2=20=E4=BE=9D?= =?UTF-8?q?=E7=84=B6=E5=9C=A8=E5=90=8E=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/lib.rs | 11 +++++++++ src-tauri/src/utils/download_manager.rs | 31 ++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 9ad8e82..904bac9 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,3 +1,6 @@ +use utils::download_manager::DownloadManager; +use tauri::Manager; + mod models; mod handlers; mod utils; @@ -29,6 +32,14 @@ pub fn run() { handlers::download::cancel_download, utils::get_user_agent, ]) + .on_window_event(|window, event| match event { + tauri::WindowEvent::Destroyed => { + // 获取 DownloadManager 实例并关闭 aria2 + let download_manager = window.state::(); + download_manager.shutdown_aria2(); + } + _ => {} + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/utils/download_manager.rs b/src-tauri/src/utils/download_manager.rs index 98068a9..06ced88 100644 --- a/src-tauri/src/utils/download_manager.rs +++ b/src-tauri/src/utils/download_manager.rs @@ -14,6 +14,7 @@ pub struct DownloadManager { queue: Mutex>, aria2_started: Arc, aria2_port: Arc>, + aria2_pid: Arc>>, } impl DownloadManager { @@ -22,6 +23,7 @@ impl DownloadManager { queue: Mutex::new(HashMap::new()), aria2_started: Arc::new(AtomicBool::new(false)), aria2_port: Arc::new(Mutex::new(5144)), + aria2_pid: Arc::new(Mutex::new(None)), } } @@ -172,7 +174,7 @@ impl DownloadManager { } // 启动 aria2c - Command::new("aria2c") + let child = Command::new("aria2c") .args([ "--enable-rpc", "--rpc-listen-all=false", @@ -182,6 +184,11 @@ impl DownloadManager { .spawn() .map_err(|e| format!("启动 aria2 失败: {}", e)).unwrap(); + // 保存进程 ID + if let Ok(mut pid_guard) = self.aria2_pid.lock() { + *pid_guard = Some(child.id()); + } + self.aria2_started.store(true, Ordering::SeqCst); } @@ -346,4 +353,26 @@ impl DownloadManager { Ok(()) } + + // 关闭 aria2 + pub fn shutdown_aria2(&self) { + if self.aria2_started.load(Ordering::SeqCst) { + // 获取保存的 PID + if let Ok(pid_guard) = self.aria2_pid.lock() { + if let Some(pid) = *pid_guard { + // 使用 kill 命令终止特定的进程 + if let Ok(output) = Command::new("kill") + .arg(pid.to_string()) + .output() { + if output.status.success() { + println!("成功关闭 aria2 (PID: {})", pid); + } else { + eprintln!("关闭 aria2 失败 (PID: {})", pid); + } + } + } + } + self.aria2_started.store(false, Ordering::SeqCst); + } + } } \ No newline at end of file