Tauri 监听器开关按钮后端逻辑
设计思路
- 启动任务: 当用户请求启动任务时,你需要:
- 获取
AppState的锁。 - 检查
watch_task是否已经是Some。 - 如果是
Some,可能需要先取消旧的任务(old_handle.abort()),然后等待它真正停止(old_handle.await,或者在 Tauri 中可能通过其他机制处理)。 - 使用
tokio::spawn()启动新任务,得到一个JoinHandle。 - 将这个
JoinHandle存入watch_task中(Some(new_handle))。 - 释放锁。
- 获取
- 停止任务: 当用户请求停止任务时,你需要:
- 获取
AppState的锁。 - 检查
watch_task是否是Some。 - 如果是
Some,获取JoinHandle,调用handle.abort()来尝试取消它。 - 将
watch_task设置回None。 - 释放锁。
- 获取
- 检查任务状态: 你可能还需要一个命令来检查是否有任务在运行。
- 获取
AppState的锁。 - 检查
watch_task是否是Some。 - 返回
true或false。 - 释放锁。
- 获取
代码实现
AppState结构体
1 | use std::{sync::Arc, thread::JoinHandle}; |
Tauri部分
引用AppState
1 | tauri::Builder::default() |
tauri::Builder::manage() 方法的作用:
manage()方法是 Tauri 提供的用于管理应用程序全局状态的机制。- 当调用
builder.manage(some_value)时,Tauri 会将some_value的一个克隆(如果some_value是Clone的)或者一个共享引用(如果some_value是Arc的) 存储在应用程序的内部状态管理器中。 - 在例子中,
AppState::new()创建了一个AppState实例。由于AppState内部使用了Arc,Tauri 实际上会将这个Arc<Mutex<Option<JoinHandle<()>>>>的共享引用存储起来。
1 |
|
** tauri::State<'_, AppState>:**
tauri::State: 这是 Tauri 提供的一个用于在命令、事件等处理函数中访问已注册状态的类型。<'_, AppState>: 这是一个生命周期和类型参数。'_: 表示生命周期是匿名的,Tauri 会自动管理它的生命周期,确保它不会比应用程序本身活得更久。AppState: 指定了我们要访问的状态类型是AppState。
- 当你将
app_state: State<'_, AppState>作为命令参数时,Tauri 会自动查找通过builder.manage(AppState::new())注册的AppState实例,并安全地将其传递给你的函数。
** state.watch_task.lock().await:**
- 返回的是一个
tokio::sync::MutexGuard<'_, Option<JoinHandle<()>>>。 MutexGuard是一个智能指针。它实现了Deref和DerefMuttrait,允许你像访问Option<JoinHandle<()>>本身一样访问它。
interval.tick().await;:
interval.tick(): 这个方法返回一个Future(一个未来的值)。这个Future会在下一次间隔时间到达时完成。.await: 这是异步 Rust 的核心关键字。当程序执行到.await时,如果Future还没有准备好(即 3 秒还没到),当前的任务(watch_valorant函数的执行)就会被暂停,Tokio 运行时会去调度执行其他可以运行的任务。一旦 3 秒到了,interval.tick()的Future就完成了,暂停的任务会被唤醒,继续执行interval.tick().await;后面的代码。