fix: 临时避免 CPU 占用率高的问题。
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
use std::{collections::HashMap, sync::Arc, time::Duration, borrow::Borrow};
|
||||
use std::{borrow::Borrow, collections::HashMap, sync::Arc, time::Duration};
|
||||
|
||||
use paris::warn;
|
||||
use tauri::async_runtime::RwLock;
|
||||
@ -73,40 +73,36 @@ impl LedColorsPublisher {
|
||||
|
||||
while screenshot_rx.changed().await.is_ok() {
|
||||
let screenshot = screenshot_rx.borrow().clone();
|
||||
let colors = screenshot
|
||||
.get_colors_by_sample_points(&sample_points)
|
||||
.await;
|
||||
let colors = screenshot.get_colors_by_sample_points(&sample_points).await;
|
||||
|
||||
let colors_copy = colors.clone();
|
||||
|
||||
let mappers = mappers.clone();
|
||||
|
||||
tokio::spawn(async move {
|
||||
match Self::send_colors_by_display(colors, mappers).await {
|
||||
Ok(_) => {
|
||||
// log::info!("sent colors: #{: >15}", display_id);
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("Failed to send colors: #{: >15}\t{}", display_id, err);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
match display_colors_tx.send((
|
||||
display_id,
|
||||
colors_copy
|
||||
.into_iter()
|
||||
.map(|color| color.get_rgb())
|
||||
.flatten()
|
||||
.collect::<Vec<_>>(),
|
||||
)) {
|
||||
match Self::send_colors_by_display(colors, mappers).await {
|
||||
Ok(_) => {
|
||||
// log::info!("sent colors: {:?}", color_len);
|
||||
// log::info!("sent colors: #{: >15}", display_id);
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("Failed to send display_colors: {}", err);
|
||||
warn!("Failed to send colors: #{: >15}\t{}", display_id, err);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// match display_colors_tx.send((
|
||||
// display_id,
|
||||
// colors_copy
|
||||
// .into_iter()
|
||||
// .map(|color| color.get_rgb())
|
||||
// .flatten()
|
||||
// .collect::<Vec<_>>(),
|
||||
// )) {
|
||||
// Ok(_) => {
|
||||
// // log::info!("sent colors: {:?}", color_len);
|
||||
// }
|
||||
// Err(err) => {
|
||||
// warn!("Failed to send display_colors: {}", err);
|
||||
// }
|
||||
// };
|
||||
|
||||
// Check if the inner task version changed
|
||||
let version = internal_tasks_version.read().await.clone();
|
||||
@ -198,60 +194,61 @@ impl LedColorsPublisher {
|
||||
});
|
||||
}
|
||||
|
||||
pub fn start(&self) {
|
||||
pub async fn start(&self) {
|
||||
log::info!("start colors worker");
|
||||
|
||||
let config_manager = ConfigManager::global().await;
|
||||
let mut config_receiver = config_manager.clone_config_update_receiver();
|
||||
let configs = config_receiver.borrow().clone();
|
||||
|
||||
self.handle_config_change(configs).await;
|
||||
|
||||
log::info!("waiting for config update...");
|
||||
while config_receiver.changed().await.is_ok() {
|
||||
log::info!("config updated, restart inner tasks...");
|
||||
let configs = config_receiver.borrow().clone();
|
||||
self.handle_config_change(configs).await;
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle_config_change(&self, configs: LedStripConfigGroup) {
|
||||
let inner_tasks_version = self.inner_tasks_version.clone();
|
||||
let configs = Self::get_colors_configs(&configs).await;
|
||||
|
||||
tokio::spawn(async move {
|
||||
let publisher = Self::global().await;
|
||||
if let Err(err) = configs {
|
||||
warn!("Failed to get configs: {}", err);
|
||||
sleep(Duration::from_millis(100)).await;
|
||||
return;
|
||||
}
|
||||
|
||||
let config_manager = ConfigManager::global().await;
|
||||
let mut config_receiver = config_manager.clone_config_update_receiver();
|
||||
let configs = configs.unwrap();
|
||||
|
||||
log::info!("waiting for config update...");
|
||||
let mut inner_tasks_version = inner_tasks_version.write().await;
|
||||
*inner_tasks_version = inner_tasks_version.overflowing_add(1).0;
|
||||
drop(inner_tasks_version);
|
||||
|
||||
while config_receiver.changed().await.is_ok() {
|
||||
log::info!("config updated, restart inner tasks...");
|
||||
let configs = config_receiver.borrow().clone();
|
||||
let configs = Self::get_colors_configs(&configs).await;
|
||||
let (display_colors_tx, display_colors_rx) = broadcast::channel::<(u32, Vec<u8>)>(8);
|
||||
|
||||
if let Err(err) = configs {
|
||||
warn!("Failed to get configs: {}", err);
|
||||
sleep(Duration::from_millis(100)).await;
|
||||
continue;
|
||||
}
|
||||
for sample_point_group in configs.sample_point_groups.clone() {
|
||||
let display_id = sample_point_group.display_id;
|
||||
let sample_points = sample_point_group.points;
|
||||
let bound_scale_factor = sample_point_group.bound_scale_factor;
|
||||
self.start_one_display_colors_fetcher(
|
||||
display_id,
|
||||
sample_points,
|
||||
bound_scale_factor,
|
||||
sample_point_group.mappers,
|
||||
display_colors_tx.clone(),
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
||||
let configs = configs.unwrap();
|
||||
|
||||
let mut inner_tasks_version = inner_tasks_version.write().await;
|
||||
*inner_tasks_version = inner_tasks_version.overflowing_add(1).0;
|
||||
drop(inner_tasks_version);
|
||||
|
||||
let (display_colors_tx, display_colors_rx) =
|
||||
broadcast::channel::<(u32, Vec<u8>)>(8);
|
||||
|
||||
for sample_point_group in configs.sample_point_groups.clone() {
|
||||
let display_id = sample_point_group.display_id;
|
||||
let sample_points = sample_point_group.points;
|
||||
let bound_scale_factor = sample_point_group.bound_scale_factor;
|
||||
publisher
|
||||
.start_one_display_colors_fetcher(
|
||||
display_id,
|
||||
sample_points,
|
||||
bound_scale_factor,
|
||||
sample_point_group.mappers,
|
||||
display_colors_tx.clone(),
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
||||
let display_ids = configs.sample_point_groups;
|
||||
publisher.start_all_colors_worker(
|
||||
display_ids.iter().map(|c| c.display_id).collect(),
|
||||
configs.mappers,
|
||||
display_colors_rx,
|
||||
);
|
||||
}
|
||||
});
|
||||
let display_ids = configs.sample_point_groups;
|
||||
self.start_all_colors_worker(
|
||||
display_ids.iter().map(|c| c.display_id).collect(),
|
||||
configs.mappers,
|
||||
display_colors_rx,
|
||||
);
|
||||
}
|
||||
|
||||
pub async fn send_colors(offset: u16, mut payload: Vec<u8>) -> anyhow::Result<()> {
|
||||
|
@ -224,8 +224,10 @@ async fn main() {
|
||||
})
|
||||
});
|
||||
|
||||
let led_color_publisher = ambient_light::LedColorsPublisher::global().await;
|
||||
led_color_publisher.start();
|
||||
tokio::spawn(async move {
|
||||
let led_color_publisher = ambient_light::LedColorsPublisher::global().await;
|
||||
led_color_publisher.start().await;
|
||||
});
|
||||
|
||||
let _volume = VolumeManager::global().await;
|
||||
|
||||
@ -286,7 +288,8 @@ async fn main() {
|
||||
let bytes = tokio::task::block_in_place(move || {
|
||||
tauri::async_runtime::block_on(async move {
|
||||
let screenshot_manager = ScreenshotManager::global().await;
|
||||
let rx: Result<tokio::sync::watch::Receiver<Screenshot>, anyhow::Error> = screenshot_manager.subscribe_by_display_id(display_id).await;
|
||||
let rx: Result<tokio::sync::watch::Receiver<Screenshot>, anyhow::Error> =
|
||||
screenshot_manager.subscribe_by_display_id(display_id).await;
|
||||
|
||||
if let Err(err) = rx {
|
||||
anyhow::bail!("Display#{}: not found. {}", display_id, err);
|
||||
@ -401,82 +404,82 @@ async fn main() {
|
||||
}
|
||||
});
|
||||
|
||||
// let app_handle = app.handle().clone();
|
||||
// tokio::spawn(async move {
|
||||
// let publisher = ambient_light::LedColorsPublisher::global().await;
|
||||
// let mut publisher_update_receiver = publisher.clone_sorted_colors_receiver().await;
|
||||
// loop {
|
||||
// if let Err(err) = publisher_update_receiver.changed().await {
|
||||
// error!("publisher update receiver changed error: {}", err);
|
||||
// return;
|
||||
// }
|
||||
let app_handle = app.handle().clone();
|
||||
tokio::spawn(async move {
|
||||
let publisher = ambient_light::LedColorsPublisher::global().await;
|
||||
let mut publisher_update_receiver = publisher.clone_sorted_colors_receiver().await;
|
||||
loop {
|
||||
if let Err(err) = publisher_update_receiver.changed().await {
|
||||
error!("publisher update receiver changed error: {}", err);
|
||||
return;
|
||||
}
|
||||
|
||||
// let publisher = publisher_update_receiver.borrow().clone();
|
||||
let publisher = publisher_update_receiver.borrow().clone();
|
||||
|
||||
// app_handle
|
||||
// .emit_all("led_sorted_colors_changed", publisher)
|
||||
// .unwrap();
|
||||
// }
|
||||
// });
|
||||
app_handle
|
||||
.emit_all("led_sorted_colors_changed", publisher)
|
||||
.unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
// let app_handle = app.handle().clone();
|
||||
// tokio::spawn(async move {
|
||||
// let publisher = ambient_light::LedColorsPublisher::global().await;
|
||||
// let mut publisher_update_receiver = publisher.clone_colors_receiver().await;
|
||||
// loop {
|
||||
// if let Err(err) = publisher_update_receiver.changed().await {
|
||||
// error!("publisher update receiver changed error: {}", err);
|
||||
// return;
|
||||
// }
|
||||
let app_handle = app.handle().clone();
|
||||
tokio::spawn(async move {
|
||||
let publisher = ambient_light::LedColorsPublisher::global().await;
|
||||
let mut publisher_update_receiver = publisher.clone_colors_receiver().await;
|
||||
loop {
|
||||
if let Err(err) = publisher_update_receiver.changed().await {
|
||||
error!("publisher update receiver changed error: {}", err);
|
||||
return;
|
||||
}
|
||||
|
||||
// let publisher = publisher_update_receiver.borrow().clone();
|
||||
let publisher = publisher_update_receiver.borrow().clone();
|
||||
|
||||
// app_handle
|
||||
// .emit_all("led_colors_changed", publisher)
|
||||
// .unwrap();
|
||||
// }
|
||||
// });
|
||||
app_handle
|
||||
.emit_all("led_colors_changed", publisher)
|
||||
.unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
// let app_handle = app.handle().clone();
|
||||
// tokio::spawn(async move {
|
||||
// loop {
|
||||
// match UdpRpc::global().await {
|
||||
// Ok(udp_rpc) => {
|
||||
// let mut receiver = udp_rpc.subscribe_boards_change();
|
||||
// loop {
|
||||
// if let Err(err) = receiver.changed().await {
|
||||
// error!("boards change receiver changed error: {}", err);
|
||||
// return;
|
||||
// }
|
||||
let app_handle = app.handle().clone();
|
||||
tokio::spawn(async move {
|
||||
loop {
|
||||
match UdpRpc::global().await {
|
||||
Ok(udp_rpc) => {
|
||||
let mut receiver = udp_rpc.subscribe_boards_change();
|
||||
loop {
|
||||
if let Err(err) = receiver.changed().await {
|
||||
error!("boards change receiver changed error: {}", err);
|
||||
return;
|
||||
}
|
||||
|
||||
// let boards = receiver.borrow().clone();
|
||||
let boards = receiver.borrow().clone();
|
||||
|
||||
// let boards = boards.into_iter().collect::<Vec<_>>();
|
||||
let boards = boards.into_iter().collect::<Vec<_>>();
|
||||
|
||||
// app_handle.emit_all("boards_changed", boards).unwrap();
|
||||
// }
|
||||
// }
|
||||
// Err(err) => {
|
||||
// error!("udp rpc error: {}", err);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
app_handle.emit_all("boards_changed", boards).unwrap();
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
error!("udp rpc error: {}", err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// let app_handle = app.handle().clone();
|
||||
// tokio::spawn(async move {
|
||||
// let display_manager = DisplayManager::global().await;
|
||||
// let mut rx = display_manager.subscribe_displays_changed();
|
||||
let app_handle = app.handle().clone();
|
||||
tokio::spawn(async move {
|
||||
let display_manager = DisplayManager::global().await;
|
||||
let mut rx = display_manager.subscribe_displays_changed();
|
||||
|
||||
// while rx.changed().await.is_ok() {
|
||||
// let displays = rx.borrow().clone();
|
||||
while rx.changed().await.is_ok() {
|
||||
let displays = rx.borrow().clone();
|
||||
|
||||
// log::info!("displays changed. emit displays_changed event.");
|
||||
log::info!("displays changed. emit displays_changed event.");
|
||||
|
||||
// app_handle.emit_all("displays_changed", displays).unwrap();
|
||||
// }
|
||||
// });
|
||||
app_handle.emit_all("displays_changed", displays).unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
Ok(())
|
||||
})
|
||||
|
@ -54,7 +54,7 @@ impl Board {
|
||||
board_message_channels.volume_setting_request_sender.clone();
|
||||
|
||||
loop {
|
||||
match socket.try_recv(&mut buf) {
|
||||
match socket.recv(&mut buf).await {
|
||||
Ok(len) => {
|
||||
log::info!("recv: {:?}", &buf[..len]);
|
||||
if buf[0] == 3 {
|
||||
|
@ -54,7 +54,7 @@ impl UdpRpc {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
let shared_self_for_check = shared_self.clone();
|
||||
tokio::spawn(async move {
|
||||
shared_self_for_check.check_boards().await;
|
||||
@ -99,7 +99,9 @@ impl UdpRpc {
|
||||
}
|
||||
|
||||
if boards.insert(board_info.fullname.clone(), board).is_some() {
|
||||
info!("added board {:?}", board_info);
|
||||
info!("replace board {:?}", board_info);
|
||||
} else {
|
||||
info!("add board {:?}", board_info);
|
||||
}
|
||||
|
||||
let tx_boards = boards
|
||||
|
@ -121,7 +121,7 @@ impl ScreenshotManager {
|
||||
let merged_screenshot_tx = self.merged_screenshot_tx.clone();
|
||||
let display = rust_swift_screencapture::display::Display::new(display_id);
|
||||
|
||||
display.start_capture().await;
|
||||
display.start_capture(30).await;
|
||||
|
||||
let mut frame_rx = display.subscribe_frame().await;
|
||||
|
||||
@ -156,7 +156,7 @@ impl ScreenshotManager {
|
||||
// log::warn!("merged_screenshot_tx.send failed: {}", err);
|
||||
}
|
||||
if let Err(err) = tx_for_send.send(screenshot.clone()) {
|
||||
log::warn!("display {} screenshot_tx.send failed: {}", display_id, err);
|
||||
// log::warn!("display {} screenshot_tx.send failed: {}", display_id, err);
|
||||
} else {
|
||||
log::debug!("screenshot: {:?}", screenshot);
|
||||
}
|
||||
|
Reference in New Issue
Block a user