From bbaa9d09e153d17f61142f330144f141bb5a850c Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 29 Jun 2025 22:56:53 +0200 Subject: [PATCH] multithreading --- src/extensions/mod.rs | 1 + src/extensions/tick.rs | 19 ++++++++++++++----- src/lib.rs | 18 +++++++++++------- src/main.rs | 4 ++-- src/widget.rs | 11 +++++++---- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index ca821c1..4935328 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -6,5 +6,6 @@ use std::sync::Arc; use crate::widget::Widget; pub trait Extension { + fn init(&self, _widgets: &Vec>) {} fn render(&self, _widget: &Arc) {} } diff --git a/src/extensions/tick.rs b/src/extensions/tick.rs index 4b41a1a..ac072ca 100644 --- a/src/extensions/tick.rs +++ b/src/extensions/tick.rs @@ -2,13 +2,22 @@ use std::sync::Arc; use crate::{component, extensions::Extension, widget::Widget}; -pub struct TickExtension; +pub struct TickExtension(pub u16); impl Extension for TickExtension { - fn render(&self, _widget: &Arc) { - if let Some(on_tick) = _widget.get::() { - (on_tick.0)(_widget) - } + fn init(&self, widgets: &Vec>) { + let rate_dur = 1000 / self.0 as u64; + std::thread::spawn({ + let widgets = widgets.clone(); + move || loop { + for w in &widgets { + if let Some(on_tick) = w.get::() { + (on_tick.0)(&w) + } + } + std::thread::sleep(std::time::Duration::from_millis(rate_dur)); + } + }); } } diff --git a/src/lib.rs b/src/lib.rs index 8af9919..529f8d4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,21 +16,21 @@ pub mod utils; pub mod widget; pub struct Screen { - pub elements: Vec>, + pub widgets: Vec>, extensions: Vec>>, } impl Screen { pub fn new() -> Screen { Screen { - elements: Vec::new(), + widgets: Vec::new(), extensions: Vec::new(), } } pub fn draw(&mut self, element: E) -> &Arc { - self.elements.push(Arc::new(Widget::new(Box::new(element)))); - self.elements.last().unwrap() + self.widgets.push(Arc::new(Widget::new(Box::new(element)))); + self.widgets.last().unwrap() } pub fn extension(&mut self, ext: E) { @@ -38,15 +38,19 @@ impl Screen { } pub fn run(&mut self) -> std::io::Result<()> { - for elem in &mut self.elements { + for elem in &mut self.widgets { elem.component(Transform::new()); } + for ext in &self.extensions { + ext.init(&self.widgets); + } + utils::hide_cursor()?; loop { self.render()?; - std::thread::sleep(std::time::Duration::from_millis(50)); + std::thread::sleep(std::time::Duration::from_millis(28)); } } @@ -54,7 +58,7 @@ impl Screen { let mut scope = RenderScope::new(); utils::clear()?; - for elem in &self.elements { + for elem in &self.widgets { scope.clear(); if let Some(t) = elem.get() { scope.set_transform(&t); diff --git a/src/main.rs b/src/main.rs index 8b5ef06..ec3e4eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ use osui::{ fn main() { let mut screen = Screen::new(); screen.extension(VelocityExtension); - screen.extension(TickExtension); + screen.extension(TickExtension(60)); screen .draw(format!("Hello, World!")) @@ -20,7 +20,7 @@ fn main() { if let Some(mut v) = w.get::() { if let Some(t) = w.get::() { if let Position::Const(c) = t.x { - if c == 30 { + if c >= 30 { v.0 = 0; w.set_component(v); } diff --git a/src/widget.rs b/src/widget.rs index bbc09fc..2584a36 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -6,21 +6,24 @@ use std::{ use crate::render_scope::RenderScope; -pub trait Element { +pub type BoxedElement = Box; +pub type BoxedComponent = Box; + +pub trait Element: Send + Sync { #[allow(unused)] fn render(&mut self, scope: &mut RenderScope) {} fn as_any(&self) -> &dyn Any; fn as_any_mut(&mut self) -> &mut dyn Any; } -pub trait Component { +pub trait Component: Send + Sync { fn as_any(&self) -> &dyn Any; fn as_any_mut(&mut self) -> &mut dyn Any; } pub struct Widget( - pub Mutex>, - Mutex>>, + pub Mutex, + Mutex>, ); impl Widget {