浏览代码

TThreadedQueueCS some fixes & improvements

Unknown 5 年之前
父节点
当前提交
85aeb7337b
共有 1 个文件被更改,包括 12 次插入4 次删除
  1. 12 4
      Quick.Threads.pas

+ 12 - 4
Quick.Threads.pas

@@ -1,10 +1,10 @@
 { ***************************************************************************
 { ***************************************************************************
 
 
-  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    : 22/08/2019
@@ -68,7 +68,7 @@ type
     FPushTimeout, FPopTimeout: Cardinal;
     FPushTimeout, FPopTimeout: Cardinal;
     FTotalItemsPushed, FTotalItemsPopped: Cardinal;
     FTotalItemsPushed, FTotalItemsPopped: Cardinal;
   public
   public
-    constructor Create(AQueueDepth: Integer = 10; PushTimeout: Cardinal = INFINITE; PopTimeout: Cardinal = INFINITE);
+    constructor Create(AQueueDepth: Integer = 16; PushTimeout: Cardinal = INFINITE; PopTimeout: Cardinal = INFINITE);
     destructor Destroy; override;
     destructor Destroy; override;
     procedure Grow(ADelta: Integer);
     procedure Grow(ADelta: Integer);
     function PushItem(const AItem: T): TWaitResult; overload;
     function PushItem(const AItem: T): TWaitResult; overload;
@@ -606,9 +606,11 @@ begin
   {$ENDIF}
   {$ENDIF}
 end;
 end;
 
 
-constructor TThreadedQueueCS<T>.Create(AQueueDepth: Integer = 10; PushTimeout: Cardinal = INFINITE; PopTimeout: Cardinal = INFINITE);
+constructor TThreadedQueueCS<T>.Create(AQueueDepth: Integer = 16; PushTimeout: Cardinal = INFINITE; PopTimeout: Cardinal = INFINITE);
 begin
 begin
   inherited Create;
   inherited Create;
+  if AQueueDepth < 10 then raise Exception.Create('QueueDepth will be 10 or greater value');
+
   SetLength(FQueue, AQueueDepth);
   SetLength(FQueue, AQueueDepth);
   FQueueLock := TCriticalSection.Create;
   FQueueLock := TCriticalSection.Create;
   {$IFDEF FPC}
   {$IFDEF FPC}
@@ -715,6 +717,12 @@ function TThreadedQueueCS<T>.PushItem(const AItem: T; var AQueueSize: Integer):
 begin
 begin
   FQueueLock.Enter;
   FQueueLock.Enter;
   try
   try
+      if FQueueSize >= High(FQueue) then
+  begin
+    if FQueueSize < 512 then Grow(FQueueSize * 2)
+      else Grow(10);
+  end;
+
     Result := wrSignaled;
     Result := wrSignaled;
     while (Result = wrSignaled) and (FQueueSize = Length(FQueue)) and not FShutDown do
     while (Result = wrSignaled) and (FQueueSize = Length(FQueue)) and not FShutDown do
     begin
     begin