Tengo una aplicación que, mientras se realiza una tarea en segundo plano, muestra una barra de progreso con un cálculo del "tiempo restante estimado" (por ejemplo, "5 segundos restantes") y un "tiempo estimado de finalización" (por ejemplo, "completa a las 12:59 : 59 "), o como yo lo llamo, la ETA.¿Cómo puedo eliminar el "jitter" de mi cálculo de "tiempo estimado restante" (y ETA)?
El algoritmo para calcular esta ETA básicamente toma el "promedio móvil" de progreso en el tiempo:
1. Cada evento de progreso se agrega a una cola con la hora actual.
2. Después de una cierta duración (por ejemplo, 10 s), los elementos se eliminan de la cola.
3. La ETA se extrapola del primer y último elemento de la cola.
El código fuente está disponible si se preocupan: ETACalculator.cs
Sin embargo, hay un problema fluctuación. A medida que se agrega cada evento de progreso al cálculo, la ETA se actualizará ligeramente. Digamos que la ETA cambia solo por 0.1s
. Este pequeño jitter fácilmente causa que el ETA "revolotee". Por ejemplo, en lugar de ver una progresión suave desde 5s, 4s, 3s, etc ..., veo 5-5-5-4-5-4-5-4-5-4-4-4.
Estaba pensando simplemente en reducir las actualizaciones a 1 por segundo, pero luego la barra de progreso es menos uniforme, y también me gustaría que las ralentizaciones "reales" se muestren en tiempo real.
Tengo problemas para encontrar un algoritmo simple que reduzca esta inestabilidad. ¿Cómo puedo eliminar el jitter?
¿Winforms? WPF? ¿Algo más? ¿Puedes publicar el código relevante? – Oded
Obligatorio [referencia xkcd] (http://xkcd.com/612/). – Ani
Actualice el progreso solo si se reduce. (es decir, no vuelva a cambiar a 5 si actualmente estamos en 4). –