线程池任务队列(二)

2014-11-24 10:13:24 · 作者: · 浏览: 1
State;
procedure setWorkState(Const Value:TTaskState);
public
Constructor Create;
Destructor Destroy;override;
procedure execTask;virtual; abstract;
property WorkId:Cardinal read FWorkId write FWorkId;
property WorkName:String read FWorkName write FWorkName;
property WorkLevel:TTaskLevel read FWorkLevel write FWorkLevel;
property WorkState : TTaskState read FWorkState write setWorkState;
End;

TWorkTaskQueue = Array of TWorkTask;

TThreadPool = Class;

TWorkThreadState = (wtIdle,wtRunning,wtStop,wtFinished);
//工作线程(单个线程一次只能处理一个task)
TWorkThread = Class(TThread)
private
FPool:TThreadPool;
FState:TWorkThreadState;
procedure SetDefault;
protected
procedure Execute;override;
public
Constructor Create(Const pool:TThreadPool);
property State : TWorkThreadState read FState write FState;
End;

TWorkThreadQueue = Array of TWorkThread;

//查看缓冲情况事件
TListenCacheInfoEvent = procedure (Sender:TObject;Const IdleCount,BusyCount,TaskCount:Integer) of Object;
TTaskQueueFullEvent = procedure (Sender:TObject) of Object;
//任务处理完后
TTaskFinishedEvent = procedure (Const cTast:TWorkTask) of object;
//任务准备被处理前事件
TTaskWillDoBeforeEvent = procedure (Const thId:Cardinal;Const cTast:TWorkTask) of Object;
//外部排序任务队列算法,默认为快速排序,可自行在外部定制算法。
TSortTaskQueueEvent = procedure (Sender:TObject;var taskQueue:TWorkTaskQueue) of object;

TThreadPool = Class
private
Log:TPoolLog;
//自动回收标识
FAuto:Boolean;
//定时等待控制
FWaitFlag:Boolean;
//表示正在用于等待回收到的线程
Waiting:TWorkThread;
//提取任务通知信号
entTaskNotify:Tevent;
//时间事件HANDLE
hTimeJump:Cardinal;
//是否排序任务队列
FSorted:Boolean;
//对空闲队列操作锁
hIDleLock:TCriticalSection;
//对正在进行的线程锁
hBusyLock:TCriticalSection;
//任务队列锁
hTaskLock:TCriticalSection;
//预设线程数 默认为5 发现忙不过来时才进行自增直到Max
FMinNums:Integer;
//最大限制线程数,默认为100
FMaxNums:Integer;
//任务队列缓冲大小 默认100
FTasksCache:Integer;
//当线程空闲时间长达XX时自动回收 :单位为分钟
FRecoverInterval:Integer;
//是否允许队列中存在重复任务 (同一任务时要考虑线程同步),默认为否
FIsAllowTheSameTask:Boolean;
//任务队列 (不释放外部任务) 最大100个任务。当大于100个任务时,需要等待
//每抽取一个任务,立即从队列中删除。
TaskQueue:TWorkTaskQueue;
//工作线程
BusyQueue:TWorkThreadQueue;
//空闲线程
IdleQueue:TWorkThreadQueue;

//************************事件回调**********************//
//排序队列回调
FOnSortTask:TSortTaskQueueEvent;
FOnTaskWillDo:TTaskWillDoBeforeEvent;
FOnTaskFinished:TTaskFinishedEvent;
FOnTaskFull:TTaskQueueFullEvent;
FOnListenInfo:TListenCacheInfoEvent;
//*****************************************************//

//************************Get/Set操作*******************//
procedure SetMinNums(Const Value:Integer);
function getTaskQueueCount: Integer;
function getBusyQue