]> uap-core.de Git - note.git/commitdiff
add backend thread
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 14 May 2026 18:19:50 +0000 (20:19 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 14 May 2026 18:19:50 +0000 (20:19 +0200)
application/src/backend.rs
application/src/main.rs

index 19c3d61e9ffad274dcbb0f6adfadf05777dab5d2..a1fc41c11b091a14c9b99288c8aebbd398a0b247 100644 (file)
@@ -1,6 +1,10 @@
+use std::future::Future;
+use std::pin::Pin;
 use sea_orm::{ActiveModelTrait, Database, DatabaseConnection, DbErr, EntityTrait, QueryFilter, ColumnTrait, Set};
 use tokio::runtime::Runtime;
 use std::sync::{Arc};
+use tokio::sync::mpsc;
+use tokio::sync::mpsc::UnboundedSender;
 use migration::{Migrator, MigratorTrait};
 use ui_rs::ui;
 
@@ -14,6 +18,19 @@ pub struct Backend {
     pub current_profile: Option<profile::Model>,
 }
 
+type CmdFuture = Pin<Box<dyn Future<Output = ()> + Send>>;
+pub trait Cmd: Send {
+    fn run(self: Box<Self>, backend: Arc<Backend>) -> CmdFuture;
+}
+
+pub type DynCmd = Box<dyn Cmd>;
+
+pub struct BackendHandle {
+    tx: UnboundedSender<DynCmd>,
+}
+
+
+
 impl Backend {
     pub fn new() -> Result<Self, DbErr> {
         let rt = Arc::new(
@@ -97,4 +114,26 @@ impl Backend {
 
         Ok(profile)
     }
+
+    pub fn start(self) -> BackendHandle {
+        let backend = Arc::new(self);
+
+        let (tx, mut rx) = mpsc::unbounded_channel::<DynCmd>();
+
+        let rt = backend.rt.clone();
+
+        std::thread::spawn(move || {
+            rt.block_on(async move {
+                while let Some(cmd) = rx.recv().await {
+                    let backend = backend.clone();
+
+                    tokio::spawn(async move {
+                        cmd.run(backend).await;
+                    });
+                }
+            });
+        });
+
+        BackendHandle { tx }
+    }
 }
index c055206864af55ddcb06dfd7ed0669f9aae266e3..fe0c235d23780061536ea5d034a34fc6dee03506 100644 (file)
@@ -30,9 +30,10 @@ mod window;
 mod backend;
 
 use std::env;
+use tokio::sync::mpsc;
 use ui_rs::{ui};
 use ui_rs::ui::*;
-use crate::backend::Backend;
+use crate::backend::{Backend, BackendHandle, DynCmd};
 use crate::window::*;
 
 fn main() {
@@ -46,7 +47,9 @@ fn main() {
         }
     };
 
-    let mut app = App { backend: backend };
+    let handle = backend.start();
+
+    let mut app = App { backend: handle };
     ui::app_run::<MainWindow>(&mut app);
 }
 
@@ -97,7 +100,7 @@ fn init_backend() -> Result<Backend, ErrMsg> {
 }
 
 struct App {
-    backend: Backend,
+    backend: BackendHandle,
 }