delphi线程池单元文件uThreadPool.pas,用法如下
type
TRecvCommDataWorkItem=class(TWorkItem)
public
// updatetime,addtime:TDateTime;
// orderid,ordertype,urljson,loadcount,savepath:string;
url,Filename:string;
total,order:Integer;
_orderid:string;
failedcount:Integer;
IFCoverFile:Boolean;
// 线程处理请求时触发的事件
procedure DealwithCommRecvData(Sender: TThreadsPool; WorkItem: TWorkItem; aThread: TProcessorThread);
// 线程初始化时触发的事件
procedure TProcessorThreadInitializing(Sender: TThreadsPool; aThread:TProcessorThread);
// 线程结束时触发的事件
procedure TProcessorThreadFinalizing(Sender: TThreadsPool; aThread:TProcessorThread);
//任务队列空时触发的事件
procedure TQueueEmpty(Sender: TThreadsPool; EmptyKind: TEmptyKind);
end;
先声明一个类
然后用法
FThreadPool := TThreadsPool.Create(nil); // 创建线程池
FThreadPool.ThreadsMin := 10; // 初始工作线程数
FThreadPool.ThreadsMax := 100; // 最大允许工作线程数
AWorkItem := TRecvCommDataWorkItem.Create;
ISAllOverLoad:=False;
AWorkItem.url:=urljson;
AWorkItem.order:=i;
AWorkItem.total:=JA.Count;
AWorkItem.Filename:=savefilepath;
AWorkItem._orderid:=orderid;
AWorkItem.IFCoverFile:=IFCoverFile;
FThreadPool.AddRequest(AWorkItem,True); // 向线程池分配一个任务
FThreadPool.OnProcessRequest := AWorkItem.DealwithCommRecvData;
FThreadPool.OnThreadInitializing := AWorkItem.TProcessorThreadInitializing;
FThreadPool.OnThreadFinalizing := AWorkItem.TProcessorThreadFinalizing;
FThreadPool.OnQueueEmpty := AWorkItem.TQueueEmpty;
仔细看下线程池单元的函数说明轻松搞定。
procedure TRecvCommDataWorkItem.TQueueEmpty(Sender: TThreadsPool;
EmptyKind: TEmptyKind);
begin
if EmptyKind=ekProcessingFinished then
begin
try
if Assigned(geturl) then //存在的bug 如果下载文件存在的不行
begin
//Sleep(200); //激活线程可能会发生在 休眠之前!!
ISAllOverLoad:=True;
if geturl.Suspended then //只有线程休眠了 才应该激活线程 否则不应该激活
geturl.Resume;
end;
finally
end;
end;
end;
1