From 76604d84d863a76a6cfecb0f1ea740fc7a805898 Mon Sep 17 00:00:00 2001 From: glax Date: Sun, 11 Jun 2023 18:24:26 +0200 Subject: [PATCH] Better way of handling progress, and childProgress. --- Tranga/TaskManager.cs | 15 ++++---- Tranga/TrangaTask.cs | 37 ++++++++++++------- Tranga/TrangaTasks/DownloadChapterTask.cs | 2 +- Tranga/TrangaTasks/DownloadNewChaptersTask.cs | 2 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/Tranga/TaskManager.cs b/Tranga/TaskManager.cs index d96416e..4cc57f5 100644 --- a/Tranga/TaskManager.cs +++ b/Tranga/TaskManager.cs @@ -137,7 +137,7 @@ public class TaskManager DeleteTask(taskToRemove); DownloadChapterTask newTask = new (taskToRemove.task, taskToRemove.connectorName, taskToRemove.publication, taskToRemove.chapter, taskToRemove.language, - taskToRemove.parentTask); + (DownloadNewChaptersTask?)taskToRemove.parentTask); AddTask(newTask); taskToRemove.parentTask?.ReplaceFailedChildTask(taskToRemove, newTask); } @@ -427,13 +427,14 @@ public class TaskManager this._allTasks = JsonConvert.DeserializeObject>(buffer, new JsonSerializerSettings() { Converters = { new TrangaTask.TrangaTaskJsonConverter() } })!; } - foreach (TrangaTask task in this._allTasks.Where(task => task.GetType() == typeof(DownloadChapterTask))) + foreach (TrangaTask task in this._allTasks.Where(tTask => tTask.parentTaskId is not null)) { - DownloadChapterTask dcTask = (DownloadChapterTask)task; - IEnumerable dncTasks = this._allTasks.Where(pTask => pTask.GetType() == typeof(DownloadNewChaptersTask)); - DownloadNewChaptersTask? parentTask = (DownloadNewChaptersTask?)dncTasks.FirstOrDefault(pTask => pTask.taskId.Equals(dcTask.parentTaskId)); - dcTask.parentTask = parentTask; - parentTask?.AddChildTask(dcTask); + TrangaTask? parentTask = this._allTasks.FirstOrDefault(pTask => pTask.taskId == task.parentTaskId); + if (parentTask is not null) + { + task.parentTask = parentTask; + parentTask.AddChildTask(task); + } } diff --git a/Tranga/TrangaTask.cs b/Tranga/TrangaTask.cs index 3d65699..f2b2ed1 100644 --- a/Tranga/TrangaTask.cs +++ b/Tranga/TrangaTask.cs @@ -22,21 +22,16 @@ public abstract class TrangaTask public DateTime lastExecuted { get; set; } public Task task { get; } public string taskId { get; set; } - [Newtonsoft.Json.JsonIgnore]public ExecutionState state { get; set; } - [Newtonsoft.Json.JsonIgnore]protected HashSet childTasks { get; } - [Newtonsoft.Json.JsonIgnore]public TrangaTask? parentTask { get; set; } - public string? parentTaskId { get; set; } + [Newtonsoft.Json.JsonIgnore] public ExecutionState state { get; set; } + [Newtonsoft.Json.JsonIgnore] protected HashSet childTasks { get; } + [Newtonsoft.Json.JsonIgnore] public TrangaTask? parentTask { get; set; } + public string? parentTaskId { get; set; } [Newtonsoft.Json.JsonIgnore]public double progress { get; private set; } - [Newtonsoft.Json.JsonIgnore]public DateTime nextExecution => lastExecuted.Add(reoccurrence); [Newtonsoft.Json.JsonIgnore]public DateTime executionStarted { get; private set; } - - [Newtonsoft.Json.JsonIgnore] - public DateTime executionApproximatelyFinished => this.progress != 0 - ? this.executionStarted.Add(DateTime.Now.Subtract(this.executionStarted).Divide(this.progress)) - : DateTime.MaxValue; - - [Newtonsoft.Json.JsonIgnore]public TimeSpan executionApproximatelyRemaining => this.executionApproximatelyFinished.Subtract(DateTime.Now); [Newtonsoft.Json.JsonIgnore]public DateTime lastChange { get; private set; } + [Newtonsoft.Json.JsonIgnore]public DateTime executionApproximatelyFinished => progress != 0 ? lastChange.Add(GetRemainingTime()) : DateTime.MaxValue; + [Newtonsoft.Json.JsonIgnore]public TimeSpan executionApproximatelyRemaining => executionApproximatelyFinished.Subtract(DateTime.Now); + [Newtonsoft.Json.JsonIgnore]public DateTime nextExecution => lastExecuted.Add(reoccurrence); public enum ExecutionState { Waiting, Enqueued, Running } @@ -88,23 +83,37 @@ public abstract class TrangaTask this.DecrementProgress(failed.progress); } - public void AddChildTask(DownloadChapterTask childTask) + public void AddChildTask(TrangaTask childTask) { this.childTasks.Add(childTask); } public void IncrementProgress(double amount) { + this.lastChange = DateTime.Now; this.progress += amount / (childTasks.Count > 0 ? childTasks.Count : 1); - parentTask?.IncrementProgress(amount); + if (parentTask is not null) + { + parentTask.IncrementProgress(amount); + parentTask.state = ExecutionState.Running; + } } public void DecrementProgress(double amount) { + this.lastChange = DateTime.Now; this.progress -= amount / childTasks.Count > 0 ? childTasks.Count : 1; parentTask?.DecrementProgress(amount); } + private TimeSpan GetRemainingTime() + { + if(progress == 0) + return DateTime.MaxValue.Subtract(DateTime.Now); + TimeSpan elapsed = lastChange.Subtract(executionStarted); + return elapsed.Divide(progress).Subtract(elapsed); + } + public enum Task : byte { DownloadNewChapters = 2, diff --git a/Tranga/TrangaTasks/DownloadChapterTask.cs b/Tranga/TrangaTasks/DownloadChapterTask.cs index f320139..df2fc79 100644 --- a/Tranga/TrangaTasks/DownloadChapterTask.cs +++ b/Tranga/TrangaTasks/DownloadChapterTask.cs @@ -10,7 +10,7 @@ public class DownloadChapterTask : TrangaTask public string language { get; } public Chapter chapter { get; } - public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en", TrangaTask? parentTask = null) : base(task, TimeSpan.Zero, parentTask) + public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en", DownloadNewChaptersTask? parentTask = null) : base(task, TimeSpan.Zero, parentTask) { this.chapter = chapter; this.connectorName = connectorName; diff --git a/Tranga/TrangaTasks/DownloadNewChaptersTask.cs b/Tranga/TrangaTasks/DownloadNewChaptersTask.cs index 5c7a4d6..7ab78b8 100644 --- a/Tranga/TrangaTasks/DownloadNewChaptersTask.cs +++ b/Tranga/TrangaTasks/DownloadNewChaptersTask.cs @@ -32,7 +32,7 @@ public class DownloadNewChaptersTask : TrangaTask foreach (Chapter newChapter in newChapters) { - DownloadChapterTask newTask = new (Task.DownloadChapter, this.connectorName!, pub, newChapter, this.language, this); + DownloadChapterTask newTask = new (Task.DownloadChapter, this.connectorName, pub, newChapter, this.language, this); taskManager.AddTask(newTask); this.childTasks.Add(newTask); }