From 36f7cbd3e93841536bccd7bb82c0aca4b5191802 Mon Sep 17 00:00:00 2001 From: glax Date: Sun, 11 Jun 2023 17:04:33 +0200 Subject: [PATCH] Better way of handling progress, and childProgress. More reliable taskFinishTime --- Tranga/TaskManager.cs | 1 - Tranga/TrangaTask.cs | 51 ++++++++----------- Tranga/TrangaTasks/DownloadChapterTask.cs | 2 + Tranga/TrangaTasks/DownloadNewChaptersTask.cs | 17 ------- Tranga/TrangaTasks/UpdateLibrariesTask.cs | 2 +- 5 files changed, 25 insertions(+), 48 deletions(-) diff --git a/Tranga/TaskManager.cs b/Tranga/TaskManager.cs index b71dfb6..71bef39 100644 --- a/Tranga/TaskManager.cs +++ b/Tranga/TaskManager.cs @@ -128,7 +128,6 @@ public class TaskManager DateTime.Now.Subtract(removeTask.Key.lastChange) > TimeSpan.FromMinutes(3))//3 Minutes since last update to task -> remove { logger?.WriteLine(this.GetType().ToString(), $"Disposing failed task {removeTask.Key}."); - removeTask.Key.parentTask?.DecrementProgress(removeTask.Key.progress); removeTask.Value.Cancel(); toRemove.Add(removeTask.Key); } diff --git a/Tranga/TrangaTask.cs b/Tranga/TrangaTask.cs index 7fdd8e8..a24b345 100644 --- a/Tranga/TrangaTask.cs +++ b/Tranga/TrangaTask.cs @@ -23,50 +23,31 @@ public abstract class TrangaTask public Task task { get; } public string taskId { get; set; } [Newtonsoft.Json.JsonIgnore]public ExecutionState state { get; set; } - [Newtonsoft.Json.JsonIgnore]public double progress { get; protected set; } + [Newtonsoft.Json.JsonIgnore]protected HashSet childTasks { get; } + [Newtonsoft.Json.JsonIgnore]public double progress => childTasks.Count > 0 ? childTasks.Sum(childTask => childTask.progress) / childTasks.Count : _myProgress; + [Newtonsoft.Json.JsonIgnore]private double _myProgress = 0; [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) / this.progress) + ? 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 TimeSpan executionApproximatelyRemaining => this.executionApproximatelyFinished.Subtract(DateTime.Now); [Newtonsoft.Json.JsonIgnore]public DateTime lastChange { get; private set; } - public enum ExecutionState - { - Waiting, - Enqueued, - Running - }; + public enum ExecutionState { Waiting, Enqueued, Running } protected TrangaTask(Task task, TimeSpan reoccurrence) { this.reoccurrence = reoccurrence; this.lastExecuted = DateTime.Now.Subtract(reoccurrence); this.task = task; - this.progress = 0f; this.executionStarted = DateTime.Now; this.lastChange = DateTime.MaxValue; this.taskId = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(this.executionStarted.ToString(CultureInfo.InvariantCulture))); - } - - public double IncrementProgress(double amount) - { - this.progress += amount; - this.lastChange = DateTime.Now; - return this.progress; - } - - public double DecrementProgress(double amount) - { - this.progress -= amount; - this.lastChange = DateTime.Now; - return this.progress; + this.childTasks = new(); } /// @@ -95,10 +76,22 @@ public abstract class TrangaTask logger?.WriteLine(this.GetType().ToString(), $"Finished Executing Task {this}"); } - /// True if elapsed time since last execution is greater than set interval - public bool ShouldExecute() + public void ReplaceFailedChildTask(DownloadChapterTask failed, DownloadChapterTask newTask) { - return nextExecution < DateTime.Now && state is ExecutionState.Waiting; + if (!this.childTasks.Contains(failed)) + throw new ArgumentException($"Task {failed} is not childTask of {this}"); + this.childTasks.Remove(failed); + this.childTasks.Add(newTask); + } + + public void AddChildTask(DownloadChapterTask childTask) + { + this.childTasks.Add(childTask); + } + + public void IncrementProgress(double amount) + { + this._myProgress += amount; } public enum Task : byte diff --git a/Tranga/TrangaTasks/DownloadChapterTask.cs b/Tranga/TrangaTasks/DownloadChapterTask.cs index 97c12b4..2e1bf4d 100644 --- a/Tranga/TrangaTasks/DownloadChapterTask.cs +++ b/Tranga/TrangaTasks/DownloadChapterTask.cs @@ -11,6 +11,7 @@ public class DownloadChapterTask : TrangaTask public Chapter chapter { get; } [JsonIgnore]public DownloadNewChaptersTask? parentTask { get; set; } public string? parentTaskId { get; set; } + [JsonIgnore]public new double progress { get; private set; } public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en", DownloadNewChaptersTask? parentTask = null) : base(task, TimeSpan.Zero) @@ -21,6 +22,7 @@ public class DownloadChapterTask : TrangaTask this.language = language; this.parentTask = parentTask; this.parentTaskId = parentTask?.taskId; + this.progress = 0; } protected override void ExecuteTask(TaskManager taskManager, Logger? logger, CancellationToken? cancellationToken = null) diff --git a/Tranga/TrangaTasks/DownloadNewChaptersTask.cs b/Tranga/TrangaTasks/DownloadNewChaptersTask.cs index 1f4451f..5c7a4d6 100644 --- a/Tranga/TrangaTasks/DownloadNewChaptersTask.cs +++ b/Tranga/TrangaTasks/DownloadNewChaptersTask.cs @@ -8,15 +8,11 @@ public class DownloadNewChaptersTask : TrangaTask public string connectorName { get; } public Publication publication { get; } public string language { get; } - [JsonIgnore]private HashSet childTasks { get; } - [JsonIgnore]public new double progress => childTasks.Count > 0 ? childTasks.Sum(childTask => childTask.progress) / childTasks.Count : 0; - public DownloadNewChaptersTask(Task task, string connectorName, Publication publication, TimeSpan reoccurrence, string language = "en") : base(task, reoccurrence) { this.connectorName = connectorName; this.publication = publication; this.language = language; - this.childTasks = new(); } protected override void ExecuteTask(TaskManager taskManager, Logger? logger, CancellationToken? cancellationToken = null) @@ -41,19 +37,6 @@ public class DownloadNewChaptersTask : TrangaTask this.childTasks.Add(newTask); } } - - public void ReplaceFailedChildTask(DownloadChapterTask failed, DownloadChapterTask newTask) - { - if (!this.childTasks.Contains(failed)) - throw new ArgumentException($"Task {failed} is not childTask of {this}"); - this.childTasks.Remove(failed); - this.childTasks.Add(newTask); - } - - public void AddChildTask(DownloadChapterTask childTask) - { - this.childTasks.Add(childTask); - } /// /// Updates the available Chapters of a Publication diff --git a/Tranga/TrangaTasks/UpdateLibrariesTask.cs b/Tranga/TrangaTasks/UpdateLibrariesTask.cs index c8d4f04..35a90bc 100644 --- a/Tranga/TrangaTasks/UpdateLibrariesTask.cs +++ b/Tranga/TrangaTasks/UpdateLibrariesTask.cs @@ -14,6 +14,6 @@ public class UpdateLibrariesTask : TrangaTask return; foreach(LibraryManager lm in taskManager.settings.libraryManagers) lm.UpdateLibrary(); - this.progress = 1f; + IncrementProgress(1); } } \ No newline at end of file