Tôi có một ứng dụng, trong khi thực hiện tác vụ nền, hiển thị thanh tiến trình có tính "thời gian còn lại ước tính" (ví dụ: "5 giây còn lại") và "thời gian hoàn thành ước tính" (ví dụ: "hoàn thành lúc 12:59 : 59 "), hoặc như tôi gọi nó là ETA.Làm cách nào để loại bỏ "jitter" khỏi tính toán "thời gian còn lại ước tính" (và ETA) của tôi?
Thuật toán để tính toán ETA này về cơ bản có "tiến độ trung bình" theo thời gian:
1. Mỗi sự kiện tiến trình được thêm vào hàng đợi với thời gian hiện tại.
2. Sau một khoảng thời gian nhất định (ví dụ 10 giây), các mục sẽ bị xóa khỏi hàng đợi.
3. ETA được ngoại suy từ các mục đầu tiên và cuối cùng trong hàng đợi.
Mã nguồn có sẵn nếu bạn quan tâm: ETACalculator.cs
Tuy nhiên, có một vấn đề jitter. Khi mỗi sự kiện tiến trình được thêm vào tính toán, ETA sẽ được cập nhật một chút. Giả sử rằng ETA chỉ thay đổi theo số 0.1s
. Jitter nhỏ này dễ dàng gây ra ETA để "rung". Ví dụ, thay vì nhìn thấy một sự tiến triển suôn sẻ từ 5s, 4s, 3s, vv ..., tôi thấy 5-5-5-4-5-4-5-4-5-4-4-4.
Tôi đã nghĩ đến việc chỉ giảm các bản cập nhật xuống còn 1 giây, nhưng sau đó thanh tiến trình kém trơn tru hơn, và tôi cũng thực sự muốn "chậm" thực tế được hiển thị theo thời gian thực.
Tôi đang gặp khó khăn trong việc đưa ra một thuật toán đơn giản làm giảm jitter tăng vọt này. Làm thế nào tôi có thể loại bỏ jitter?
Winforms? WPF? Thứ gì khác? Bạn có thể đăng mã có liên quan không? – Oded
Bắt buộc [tham chiếu xkcd] (http://xkcd.com/612/). – Ani
Chỉ cập nhật tiến trình nếu nó bị giảm. (ví dụ: không thay đổi lại thành 5 nếu chúng tôi hiện đang ở trên 4). –