diff --git a/src-tauri/src/cmd/app.rs b/src-tauri/src/cmd/app.rs index 959277feb..5fcc5566a 100644 --- a/src-tauri/src/cmd/app.rs +++ b/src-tauri/src/cmd/app.rs @@ -1,5 +1,6 @@ use super::CmdResult; use crate::core::sysopt::Sysopt; +use crate::utils::resolve::ui::{self, UiReadyStage}; use crate::{ cmd::StringifyErr, feat, logging, @@ -242,34 +243,14 @@ pub async fn copy_icon_file(path: String, icon_info: IconInfo) -> CmdResult CmdResult<()> { logging!(info, Type::Cmd, "前端UI已准备就绪"); - crate::utils::resolve::ui::mark_ui_ready(); + ui::mark_ui_ready(); Ok(()) } /// UI加载阶段 #[tauri::command] -pub fn update_ui_stage(stage: String) -> CmdResult<()> { - logging!(info, Type::Cmd, "UI加载阶段更新: {}", stage.as_str()); - - use crate::utils::resolve::ui::UiReadyStage; - - let stage_enum = match stage.as_str() { - "NotStarted" => UiReadyStage::NotStarted, - "Loading" => UiReadyStage::Loading, - "DomReady" => UiReadyStage::DomReady, - "ResourcesLoaded" => UiReadyStage::ResourcesLoaded, - "Ready" => UiReadyStage::Ready, - _ => { - logging!( - warn, - Type::Cmd, - "Warning: 未知的UI加载阶段: {}", - stage.as_str() - ); - return Err(format!("未知的UI加载阶段: {}", stage.as_str()).into()); - } - }; - - crate::utils::resolve::ui::update_ui_ready_stage(stage_enum); +pub fn update_ui_stage(stage: UiReadyStage) -> CmdResult<()> { + logging!(info, Type::Cmd, "UI加载阶段更新: {:?}", &stage); + ui::update_ui_ready_stage(stage); Ok(()) } diff --git a/src-tauri/src/utils/resolve/ui.rs b/src-tauri/src/utils/resolve/ui.rs index a7658528a..d93fe9e6f 100644 --- a/src-tauri/src/utils/resolve/ui.rs +++ b/src-tauri/src/utils/resolve/ui.rs @@ -1,8 +1,8 @@ use once_cell::sync::OnceCell; -use parking_lot::RwLock; +use serde::{Deserialize, Serialize}; use std::sync::{ Arc, - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicU8, Ordering}, }; use tokio::sync::Notify; @@ -11,40 +11,27 @@ use crate::{logging, utils::logging::Type}; // 获取 UI 是否准备就绪的全局状态 static UI_READY: AtomicBool = AtomicBool::new(false); // 获取UI就绪状态细节 -static UI_READY_STATE: OnceCell = OnceCell::new(); +static UI_READY_STATE: AtomicU8 = AtomicU8::new(0); // 添加通知机制,用于事件驱动的 UI 就绪检测 static UI_READY_NOTIFY: OnceCell> = OnceCell::new(); // UI就绪阶段状态枚举 -#[derive(Debug, Clone, Copy, PartialEq)] +#[repr(u8)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum UiReadyStage { - NotStarted, + NotStarted = 0, Loading, DomReady, ResourcesLoaded, Ready, } -// UI就绪详细状态 -#[derive(Debug)] -struct UiReadyState { - stage: RwLock, -} - -impl Default for UiReadyState { - fn default() -> Self { - Self { - stage: RwLock::new(UiReadyStage::NotStarted), - } - } -} - pub fn get_ui_ready() -> &'static AtomicBool { &UI_READY } -fn get_ui_ready_state() -> &'static UiReadyState { - UI_READY_STATE.get_or_init(UiReadyState::default) +fn get_ui_ready_state() -> &'static AtomicU8 { + &UI_READY_STATE } fn get_ui_ready_notify() -> &'static Arc { @@ -53,8 +40,7 @@ fn get_ui_ready_notify() -> &'static Arc { // 更新UI准备阶段 pub fn update_ui_ready_stage(stage: UiReadyStage) { - let state = get_ui_ready_state(); - *state.stage.write() = stage; + get_ui_ready_state().store(stage as u8, Ordering::Release); // 如果是最终阶段,标记UI完全就绪 if stage == UiReadyStage::Ready { mark_ui_ready();