delphi线程池单元文件uThreadPool.pas

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;
pas 文件大小:27.67KB