feat(tui): use thread builder

This commit is contained in:
AAAAAAAAAAAAAAAAAAAAAAAAAAAA 2026-01-18 21:21:14 +02:00
parent a933cbe285
commit d06e1c41f8

View file

@ -33,35 +33,36 @@ impl TuiOut {
engine: &Arc<RwLock<Tui>>, engine: &Arc<RwLock<Tui>>,
state: &Arc<RwLock<T>>, state: &Arc<RwLock<T>>,
timer: Duration timer: Duration
) -> JoinHandle<()> { ) -> Result<JoinHandle<()>, std::io::Error> {
let exited = engine.read().unwrap().exited.clone(); let exited = engine.read().unwrap().exited.clone();
let engine = engine.clone(); let engine = engine.clone();
let state = state.clone(); let state = state.clone();
let Size { width, height } = engine.read().unwrap().backend.size().expect("get size failed"); let Size { width, height } = engine.read().unwrap().backend.size().expect("get size failed");
let mut buffer = Buffer::empty(Rect { x: 0, y: 0, width, height }); let mut buffer = Buffer::empty(Rect { x: 0, y: 0, width, height });
spawn(move || loop { std::thread::Builder::new()
if exited.fetch_and(true, Relaxed) { .name("tui output thread".into())
break .spawn(move || loop {
} if exited.fetch_and(true, Relaxed) {
//let t0 = engine.read().unwrap().perf.get_t0(); break
let Size { width, height } = engine.read().unwrap().backend.size()
.expect("get size failed");
if let Ok(state) = state.try_read() {
let size = Rect { x: 0, y: 0, width, height };
if buffer.area != size {
engine.write().unwrap().backend.clear_region(ClearType::All)
.expect("clear failed");
buffer.resize(size);
buffer.reset();
} }
let mut output = TuiOut { buffer, area: [0, 0, width, height] }; let t0 = engine.read().unwrap().perf.get_t0();
state.draw(&mut output); let Size { width, height } = engine.read().unwrap().backend.size()
buffer = engine.write().unwrap().flip(output.buffer, size); .expect("get size failed");
} if let Ok(state) = state.try_read() {
//let t1 = engine.read().unwrap().perf.get_t1(t0).unwrap(); let size = Rect { x: 0, y: 0, width, height };
//buffer.set_string(0, 0, &format!("{:>3}.{:>3}ms", t1.as_millis(), t1.as_micros() % 1000), Style::default()); if buffer.area != size {
std::thread::sleep(timer); engine.write().unwrap().backend.clear_region(ClearType::All).expect("clear failed");
}) buffer.resize(size);
buffer.reset();
}
let mut output = TuiOut { buffer, area: [0, 0, width, height] };
state.draw(&mut output);
buffer = engine.write().unwrap().flip(output.buffer, size);
}
let t1 = engine.read().unwrap().perf.get_t1(t0).unwrap();
buffer.set_string(0, 0, &format!("{:>3}.{:>3}ms", t1.as_millis(), t1.as_micros() % 1000), Style::default());
std::thread::sleep(timer);
})
} }
#[inline] #[inline]
pub fn with_rect (&mut self, area: [u16;4]) -> &mut Self { pub fn with_rect (&mut self, area: [u16;4]) -> &mut Self {