Salida en directo
Leer lo que un programa escribe mientras corre: por qué se bloquea si no lo lees, cómo llega a la interfaz sin saturar el puente, y el progreso que casi nadie sabe interpretar.
Por qué se bloquea
El detalle que explica el fallo más desconcertante de esta fase:
Y por eso la solución no es opcional: cualquier proceso que pueda escribir más de unos pocos kilobytes hay que leerlo mientras corre.
Leer mientras corre
let (mut rx, child) = app.shell().command("ffmpeg").args([...]).spawn()?;let mut ultimo = Instant::now();while let Some(evento) = rx.recv().await { match evento { CommandEvent::Stdout(linea) => acumular(&linea), CommandEvent::Stderr(linea) => { // muchas herramientas informan del progreso por la salida de error if let Some(p) = interpretar_progreso(&linea) { // nivel 40.3: por cambio perceptible, no por línea if ultimo.elapsed() > Duration::from_millis(200) { ultimo = Instant::now(); let _ = app.emit("progreso", p); } } } CommandEvent::Terminated(t) => return terminar(t), _ => {} }}Tres detalles:
- Se leen las dos salidas. Muchas herramientas escriben el progreso por la salida de error y solo el resultado por la estándar; ignorar una de las dos deja al hijo bloqueado igual.
- Se emite por tiempo, no por línea. Una herramienta puede escribir cien líneas por segundo, y el nivel 40.3 ya explicó lo que pasa si cada una cruza el puente.
- Y el evento de terminación trae el código de retorno, que es lo que decide si fue bien.
Convertir salida en progreso
La parte que hace que una barra sea creíble, y hay tres niveles de calidad:
Y una nota sobre el tiempo estimado: calcúlalo con el ritmo de los últimos segundos, no con la media desde el principio, y no lo bajes y lo subas constantemente — un tiempo restante que oscila entre dos minutos y veinte segundos destruye la confianza más que no mostrarlo.
Lo que hay que guardar
La salida de un proceso también sirve después:
- Guarda la salida de error completa, aunque no la muestres. Si el proceso falla, es lo único que explica por qué, y es lo que le vas a pedir al usuario.
- No la guardes entera si es enorme. Las últimas cien líneas suelen bastar y evitan acumular megas en memoria.
- Y no la registres tal cual sin mirarla: puede contener rutas del usuario, y a veces credenciales que la herramienta imprime. Es el aviso del nivel 34.2 aplicado aquí.