性能优化

This commit is contained in:
zhongluofeng
2026-08-06 10:33:16 +08:00
parent c7578a2e6b
commit e66c53e66d
105 changed files with 7273 additions and 5002 deletions
+23 -11
View File
@@ -7,13 +7,14 @@ use std::sync::{Arc, Mutex};
use std::thread::JoinHandle;
use serde::{Deserialize, Serialize};
use specta::Type;
use super::monitor::start_monitor;
use super::reader::{write_dib, write_files, write_text};
use super::storage::Storage;
/// 剪贴板设置(持久化到 clipboard/settings.json
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone, Serialize, Deserialize, Type)]
#[serde(rename_all = "camelCase", default)]
pub struct ClipboardSettings {
/// 监听是否启用
@@ -66,7 +67,7 @@ impl ClipboardManager {
let storage = match Storage::new(&clip_dir) {
Ok(s) => Arc::new(s),
Err(e) => {
eprintln!("[clipboard] 磁盘存储初始化失败,回退内存: {}", e);
crate::logger::log_warn("clipboard", &format!("磁盘存储初始化失败,回退内存: {}", e));
Arc::new(Storage::new_in_memory())
}
};
@@ -86,7 +87,7 @@ impl ClipboardManager {
/// 启动监听(若已运行则跳过)
pub fn start(&self, app: &tauri::AppHandle) {
let mut handle = self.monitor_handle.lock().unwrap();
let mut handle = self.monitor_handle.lock().unwrap_or_else(|e| e.into_inner());
if handle.is_some() {
return;
}
@@ -99,30 +100,41 @@ impl ClipboardManager {
self.monitor_stop.clone(),
);
*handle = Some(h);
eprintln!("[clipboard] 监听已启动");
crate::logger::log_info("clipboard", "监听已启动");
}
/// 停止监听
pub fn stop(&self) {
self.monitor_stop.store(true, Ordering::SeqCst);
if let Some(h) = self.monitor_handle.lock().unwrap().take() {
// 不阻塞等待;轮询线程最迟 800ms 后退出
let _ = h.join();
if let Some(h) = self
.monitor_handle
.lock()
.unwrap_or_else(|e| e.into_inner())
.take()
{
// 后台等待监听线程退出(最迟 800ms),不阻塞调用者。
// 剪贴板 stop 命令跑在 async runtime 线程上,直接 join 会卡住 tokio worker。
std::thread::spawn(move || {
let _ = h.join();
});
}
eprintln!("[clipboard] 监听已停止");
crate::logger::log_info("clipboard", "监听已停止");
}
pub fn is_running(&self) -> bool {
self.monitor_handle.lock().unwrap().is_some()
self.monitor_handle
.lock()
.unwrap_or_else(|e| e.into_inner())
.is_some()
}
pub fn get_settings(&self) -> ClipboardSettings {
self.settings.lock().unwrap().clone()
self.settings.lock().unwrap_or_else(|e| e.into_inner()).clone()
}
pub fn save_settings(&self, s: ClipboardSettings) {
{
*self.settings.lock().unwrap() = s.clone();
*self.settings.lock().unwrap_or_else(|e| e.into_inner()) = s.clone();
}
save_settings(&self.settings_path, &s);
}