Tauri: написать дочернему std в событии обратного вызова внутри окна

Я новичок в ржавчине, и у меня возникают проблемы с записью в стандартный поток порожденного процесса по результату события в окне с использованием структуры таури .

Я могу писать на стандартный ввод процесса / сопутствующего элемента вне обратного вызова для события для окна, но он не работает внутри обратного вызова. Как будто команда просто теряется / не работает.

Я получаю события, что подтверждается заявлением println.

Мой код ниже:

      pub fn window_manager(win: Window<Wry>) {
  let (mut rx, mut child) = Command::new_sidecar("window_manager")
    .expect("failed to create `window_manager`")
    .spawn()
    .expect("Failed to spawn sidecar");

  let child = Arc::new(Mutex::new(child));
  child.lock().unwrap().write(b"********").unwrap(); // This writes to std in here...
  win.listen("event-name", move |event| {
    // let child = Arc::new(Mutex::new(child));
    // child.lock().unwrap().write(b"********").unwrap(); // This does not write to std in here...
    println!("WINDOW EVENT RECEIVED {:?}", event.payload());
  });
  
  tauri::async_runtime::spawn(async move {
    while let Some(event) = rx.recv().await {
      if let CommandEvent::Stdout(line) = event {
        println!("STDOUT from sidecar....: {}", line);
      }
    }
  });
}

Спасибо за вашу помощь.

1 ответ

Итак, я понял, что не так с кодом. Я забыл / не осознавал, что мне нужно добавить новый строковый символ в конец байтов, которые были записаны во вводе stdin, поэтому он никогда не регистрировал ввод. Следующие коды работают.

      pub fn window_manager(win: Window<Wry>) {
  let (mut rx, mut child) = Command::new_sidecar("window_manager")
        .expect("failed to create `window_manager`")
        .spawn()
        .expect("Failed to spawn sidecar");

      let child = Arc::new(Mutex::new(child));
      main_window.listen("event-name", move |event| {
        child
          .lock()
          .unwrap()
          .write("oh my lol \n".as_bytes())
          .unwrap(); // This does write to std in here...
        println!("WINDOW EVENT RECEIVED {:?}", event.payload());
      });

      tauri::async_runtime::spawn(async move {
        while let Some(event) = rx.recv().await {
          if let CommandEvent::Stdout(line) = event {
            println!("STDOUT from sidecar....: {}", line);
          }
        }
      });
}
Другие вопросы по тегам