性能优化
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user