Saltar al contenido

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

Rust
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í.