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);
}
}
});
}