Progress.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. namespace MeloongCore;
  2. public class ProgressProvider {
  3. // 设置 workerProgress
  4. private (double actual, double skiped) workerProgress = (0, 0);
  5. public void Set(double value, bool skiped = false) {
  6. value = value.Clamp(0, 1);
  7. double delta = value - workerProgress.actual - workerProgress.skiped;
  8. if (delta < 0) { // 等比减少
  9. workerProgress = (workerProgress.actual * value / (workerProgress.actual + workerProgress.skiped),
  10. workerProgress.skiped * value / (workerProgress.actual + workerProgress.skiped));
  11. } else if (skiped) {
  12. workerProgress.skiped += delta;
  13. } else {
  14. workerProgress.actual += delta;
  15. }
  16. }
  17. public void Add(double value, bool skiped = false)
  18. => Set(value + workerProgress.actual + workerProgress.skiped, skiped);
  19. // 观察
  20. private (double actual, double skiped) observedWorkerProgress = (0, 0);
  21. private double incrementProgress = 0;
  22. public double Observe() {
  23. if (workerProgress == observedWorkerProgress) return incrementProgress; // 未改变
  24. if (workerProgress.actual >= observedWorkerProgress.actual) { // 进度增加
  25. incrementProgress += (1 - incrementProgress) *
  26. (workerProgress.actual - observedWorkerProgress.actual) / (1 - observedWorkerProgress.actual - workerProgress.skiped);
  27. }
  28. observedWorkerProgress = workerProgress;
  29. return incrementProgress;
  30. }
  31. }