线程池任务队列(一)

2014-11-24 10:13:24 · 作者: · 浏览: 5
[ delphi]
unit uPool;

{***********************************************************************

线程池+任务队列

整个线程池调度图
==========================================================
| ----- ---------------------- |
| |空 | | 任务队列 ←---- | ⑴ |
| |闲 | ---------------------- |
| |线 | ↑空闲线程检查队列是否有任务 |
| |程 |--①-- 有任务要执行时,加入到工作队列 |
| |队 | | |
| |列 | ↓② ---------------- |
| | | ----------------------- | 自动回收空 | |
| | | |正在工作队列 | | 闲定时器 | |
| | | ----------------------- ---------------- |
| | | ③ | 任务做完后 | |
| ----- ←----------| 调度到空闲队列 | |
| | | |
| -----------------------------------------| |
| ④定时回收空闲线程 |
| |
==========================================================

使用方法:

pool = TThreadPool.Create;
pool.MinNums := 2; //最小线程
pool.MaxNums := 6; //最大线程
pool.TasksCacheSize := 10; //任务缓冲队列

上面创建好之后,就可以往池中放任务

pool.AddWorkTask(Task);

线程池就开始工作了。
同时线程池支持对任务进行优先级排序,排序算法默认
为快速序,也可以外问进行队列排序

这里把任务和池分开了。
使用任务时,需要继承TWorkTask进开自己的任务设计。
然后重写exectask;方法。如果方法中要进行毫时循环,
请见如下例子;
for i := 0 to 5000 do
begin
if tk.WorkState = tsFinished then break;
inc(k);
//caption := inttostr(k);
edit2.Text := inttostr(k);
end;

如:TWirteFileTask = Class(TWorkTask);


作者:边缘
@RightCopy fsh
QQ: 19985430
date: 2012-09-22
Email:fengsh998@163.com
***********************************************************************}

interface

uses
Classes,Windows,SysUtils,Messages,SyncObjs;

Const
PRE_NUM = 5;
MAX_NUM = 100;
AUTO_FREE = 2;
MAX_TASKNUM = 100;
ONEMINUTE = 10000;//60000;

type
TLogLevel = (lDebug,lInfo,lError);

ILog = interface
procedure WriteLog(Const Msg:String;Level:TLogLevel = lDebug);
end;

TPoolLog = Class(TInterfacedObject,ILog)
private
procedure WriteLog(Const Msg:String;Level:TLogLevel = lDebug);
public
procedure OutputLog(Const Msg:String;Level:TLogLevel);virtual;
End;


Thandles = Array of Cardinal;

//任务级别 优先级高的任务先执行。
TTaskLevel = (tlLower,tlNormal,tlHigh);
TTaskState = (tsNone,tsDoing,tsWaiting,tsReStart,tsStop,tsFinished);
TWorkTask = Class
private
Work:TThread;
//任务ID
hTask:TCriticalSection;
FWorkId:Cardinal;
FWorkName:String;
FWorkLevel:TTaskLevel; //默认为普通
FWorkState : TTask