Browse Source

TBackgroundTasks some improvements

Unknown 5 years ago
parent
commit
9217ae7e41
1 changed files with 12 additions and 8 deletions
  1. 12 8
      Quick.Threads.pas

+ 12 - 8
Quick.Threads.pas

@@ -1,13 +1,13 @@
 { ***************************************************************************
 { ***************************************************************************
 
 
-  Copyright (c) 2016-2019 Kike P�rez
+  Copyright (c) 2016-2019 Kike Pérez
 
 
   Unit        : Quick.Threads
   Unit        : Quick.Threads
   Description : Thread safe collections
   Description : Thread safe collections
-  Author      : Kike P�rez
+  Author      : Kike Pérez
   Version     : 1.5
   Version     : 1.5
   Created     : 09/03/2018
   Created     : 09/03/2018
-  Modified    : 22/08/2019
+  Modified    : 07/09/2019
 
 
   This file is part of QuickLib: https://github.com/exilon/QuickLib
   This file is part of QuickLib: https://github.com/exilon/QuickLib
 
 
@@ -210,6 +210,7 @@ type
 
 
   TTimeMeasure = (tmDays, tmHours, tmMinutes, tmSeconds, tmMilliseconds);
   TTimeMeasure = (tmDays, tmHours, tmMinutes, tmSeconds, tmMilliseconds);
 
 
+  ETaskAddError = class(Exception);
   ETaskInitializationError = class(Exception);
   ETaskInitializationError = class(Exception);
   ETaskExecutionError = class(Exception);
   ETaskExecutionError = class(Exception);
   ETaskParamError = class(Exception);
   ETaskParamError = class(Exception);
@@ -521,9 +522,9 @@ type
     fNumPushedTasks : Int64;
     fNumPushedTasks : Int64;
     function GetTaskQueue : Cardinal;
     function GetTaskQueue : Cardinal;
   public
   public
-    constructor Create(aConcurrentWorkers : Integer; aMaxQueue : Integer = 100);
+    constructor Create(aConcurrentWorkers : Integer; aInitialQueueSize : Integer = 100);
     destructor Destroy; override;
     destructor Destroy; override;
-    property MaxQueue : Integer read fMaxQueue;
+    property MaxQueue : Integer read fMaxQueue write fMaxQueue;
     property InsertTimeout : Cardinal read fInsertTimeout write fInsertTimeout;
     property InsertTimeout : Cardinal read fInsertTimeout write fInsertTimeout;
     property ExtractTimeout : Cardinal read fExtractTimeout write fExtractTimeout;
     property ExtractTimeout : Cardinal read fExtractTimeout write fExtractTimeout;
     property TaskQueued : Cardinal read GetTaskQueue;
     property TaskQueued : Cardinal read GetTaskQueue;
@@ -901,6 +902,7 @@ function TThreadedQueueList<T>.PushItem(const AItem: T; var AQueueSize: Integer)
 begin
 begin
   FQueueLock.Enter;
   FQueueLock.Enter;
   try
   try
+    if FQueueSize >= High(FQueue) then Grow(10);
     Result := wrSignaled;
     Result := wrSignaled;
     //while (Result = wrSignaled) and (fQueueSize = fQueue.Count) and not fShutDown do
     //while (Result = wrSignaled) and (fQueueSize = fQueue.Count) and not fShutDown do
     //begin
     //begin
@@ -1426,14 +1428,14 @@ begin
   fTaskQueue.Clear;
   fTaskQueue.Clear;
 end;
 end;
 
 
-constructor TBackgroundTasks.Create(aConcurrentWorkers : Integer; aMaxQueue : Integer = 100);
+constructor TBackgroundTasks.Create(aConcurrentWorkers : Integer; aInitialQueueSize : Integer = 100);
 begin
 begin
-  fMaxQueue := aMaxQueue;
+  fMaxQueue := 0;
   fConcurrentWorkers := aConcurrentWorkers;
   fConcurrentWorkers := aConcurrentWorkers;
   fInsertTimeout := INFINITE;
   fInsertTimeout := INFINITE;
   fExtractTimeout := 5000;
   fExtractTimeout := 5000;
   fNumPushedTasks := 0;
   fNumPushedTasks := 0;
-  fTaskQueue := TThreadedQueueCS<IWorkTask>.Create(fMaxQueue,fInsertTimeout,fExtractTimeout);
+  fTaskQueue := TThreadedQueueCS<IWorkTask>.Create(aInitialQueueSize,fInsertTimeout,fExtractTimeout);
 end;
 end;
 
 
 destructor TBackgroundTasks.Destroy;
 destructor TBackgroundTasks.Destroy;
@@ -1461,6 +1463,8 @@ function TBackgroundTasks.AddTask(aParamArray : array of const; aOwnedParams : B
 var
 var
   worktask : IWorkTask;
   worktask : IWorkTask;
 begin
 begin
+  if (fMaxQueue > 0) and (fTaskQueue.QueueSize >= fMaxQueue) then raise ETaskAddError.Create('Max queue reached: Task cannot be added');
+
   worktask := TWorkTask.Create(aParamArray,aOwnedParams,aTaskProc);
   worktask := TWorkTask.Create(aParamArray,aOwnedParams,aTaskProc);
   Inc(fNumPushedTasks);
   Inc(fNumPushedTasks);
   worktask.SetIdTask(fNumPushedTasks);
   worktask.SetIdTask(fNumPushedTasks);