refactor: reduce CPU usage

This commit is contained in:
Timofey Gelazoniya 2024-09-06 02:32:16 +03:00
parent 7138c941d9
commit 9866802f91
Signed by: zeldon
GPG Key ID: 047886915281DD2A
1 changed files with 39 additions and 31 deletions

View File

@ -3,6 +3,7 @@ use std::{
rc::Rc, rc::Rc,
sync::{mpsc, Arc, Mutex}, sync::{mpsc, Arc, Mutex},
thread, thread,
time::Duration,
}; };
use crate::manager::DeviceManager; use crate::manager::DeviceManager;
@ -193,46 +194,53 @@ impl TrayApp {
let menu_channel = MenuEvent::receiver(); let menu_channel = MenuEvent::receiver();
let mut last_update = std::time::Instant::now();
let update_interval = Duration::from_millis(100);
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
*control_flow = tao::event_loop::ControlFlow::WaitUntil( *control_flow = tao::event_loop::ControlFlow::Wait;
std::time::Instant::now() + std::time::Duration::from_millis(100),
);
if let Ok(device_ids) = rx.try_recv() { match event {
Self::update(&devices, &device_manager, &device_ids, &tray_icon); tao::event::Event::NewEvents(tao::event::StartCause::Init) => {
} TrayInner::build_tray(&tray_icon, &tray_menu, icon.clone());
}
tao::event::Event::MainEventsCleared => {
// Check if it's time to process updates
if last_update.elapsed() >= update_interval {
while let Ok(device_ids) = rx.try_recv() {
Self::update(&devices, &device_manager, &device_ids, &tray_icon);
}
if let tao::event::Event::NewEvents(tao::event::StartCause::Init) = event { while let Ok(event) = menu_channel.try_recv() {
// We create the icon once the event loop is actually running let menu_items = menu_items.lock().unwrap();
// to prevent issues like https://github.com/tauri-apps/tray-icon/issues/90 let show_console_item = &menu_items[0];
TrayInner::build_tray(&tray_icon, &tray_menu, icon.clone()); let quit_item = &menu_items[1];
}
if let Ok(event) = menu_channel.try_recv() { if event.id == show_console_item.id() {
let menu_items = menu_items.lock().unwrap(); let mut visible = console_state.lock().unwrap();
*visible = !*visible;
let show_console_item = &menu_items[0]; if *visible {
let quit_item = &menu_items[1]; unsafe { ShowWindow(GetConsoleWindow(), winuser::SW_SHOW) };
show_console_item.set_text("Hide Log Window");
trace!("showing log window");
} else {
unsafe { ShowWindow(GetConsoleWindow(), winuser::SW_HIDE) };
show_console_item.set_text("Show Log Window");
trace!("hiding log window");
}
}
if event.id == show_console_item.id() { if event.id == quit_item.id() {
let mut visible = console_state.lock().unwrap(); *control_flow = tao::event_loop::ControlFlow::Exit;
return;
}
}
if *visible { last_update = std::time::Instant::now();
unsafe { ShowWindow(GetConsoleWindow(), winuser::SW_HIDE) };
show_console_item.set_text("Show Log Window");
trace!("hiding log window");
*visible = false;
} else {
unsafe { ShowWindow(GetConsoleWindow(), SW_SHOW) };
show_console_item.set_text("Hide Log Window");
trace!("showing log window");
*visible = true
} }
} }
_ => (),
if event.id == quit_item.id() {
*control_flow = tao::event_loop::ControlFlow::Exit;
}
} }
}); });
} }