添加后端内部轮询

This commit is contained in:
柚子
2025-03-04 16:44:50 +08:00
parent 919a62ee60
commit 400880cc3e
2 changed files with 57 additions and 1 deletions

View File

@@ -40,6 +40,23 @@ pub fn run() {
} }
_ => {} _ => {}
}) })
.setup(|app| {
let app_handle = app.handle().clone();
// 创建后台任务检查下载状态
tauri::async_runtime::spawn(async move {
loop {
{
let download_manager = app_handle.state::<DownloadManager>();
if download_manager.has_downloads() {
let _ = download_manager.get_downloads().await;
}
}
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
}
});
Ok(())
})
.run(tauri::generate_context!()) .run(tauri::generate_context!())
.expect("error while running tauri application"); .expect("error while running tauri application");
} }

View File

@@ -17,6 +17,7 @@ pub struct DownloadManager {
aria2_port: Arc<Mutex<u16>>, aria2_port: Arc<Mutex<u16>>,
aria2_pid: Arc<Mutex<Option<u32>>>, aria2_pid: Arc<Mutex<Option<u32>>>,
installing: Arc<AtomicBool>, installing: Arc<AtomicBool>,
last_get_downloads: Arc<Mutex<Option<std::time::Instant>>>,
} }
impl DownloadManager { impl DownloadManager {
@@ -28,11 +29,40 @@ impl DownloadManager {
aria2_port: Arc::new(Mutex::new(5144)), aria2_port: Arc::new(Mutex::new(5144)),
aria2_pid: Arc::new(Mutex::new(None)), aria2_pid: Arc::new(Mutex::new(None)),
installing: Arc::new(AtomicBool::new(false)), // 初始化为 false installing: Arc::new(AtomicBool::new(false)), // 初始化为 false
last_get_downloads: Arc::new(Mutex::new(None)),
} }
} }
// 获取所有下载任务
pub async fn get_downloads(&self) -> Result<Vec<DownloadTaskResponse>, String> { pub async fn get_downloads(&self) -> Result<Vec<DownloadTaskResponse>, String> {
// 检查是否需要更新最后调用时间,并在作用域内立即释放锁
let should_skip_update = {
if let Ok(last_call) = self.last_get_downloads.lock() {
if let Some(last_time) = *last_call {
last_time.elapsed().as_secs_f32() < 1.0
} else {
false
}
} else {
false
}
};
if should_skip_update {
return self.get_downloads_internal().await;
}
// 更新最后调用时间,并在作用域内立即释放锁
{
if let Ok(mut last_call) = self.last_get_downloads.lock() {
*last_call = Some(std::time::Instant::now());
}
}
self.get_downloads_internal().await
}
// 获取所有下载任务
async fn get_downloads_internal(&self) -> Result<Vec<DownloadTaskResponse>, String> {
// 获取队列中的任务信息并立即克隆所需数据,然后释放锁 // 获取队列中的任务信息并立即克隆所需数据,然后释放锁
let tasks_clone: Vec<DownloadTask>; let tasks_clone: Vec<DownloadTask>;
let aria2_started; let aria2_started;
@@ -502,4 +532,13 @@ impl DownloadManager {
Err(error_msg) Err(error_msg)
} }
} }
// 检查是否有下载任务
pub fn has_downloads(&self) -> bool {
if let Ok(downloads) = self.download_queue.lock() {
!downloads.is_empty()
} else {
false
}
}
} }