任务队列过程 对于任务的处理采用单独的线程 和任务列表进行处理

{
任务队列过程 对于任务的处理采用单独的线程 和任务列表进行处理

}
unit UntTaskList;
interface
uses
  classes ,SyncObjs ,Windows, UntKernel ,UntMsgClass ,Messages, Dialogs;

TYpe
  TTaskListThread = class ;

  TTask = class
  public

  end ;
  TTaskListThread = class(TThread)
  protected
    FTasklist : TList ;
    FSemaphore : TSemaphore ;
    FCs : TCriticalSection ;
    FTaskManager : Tobject ;
    Procedure ClearList ;
  public
    function  GetTask(var Atask : TTask ): Boolean;
    procedure AddTask(Atask : TTask); virtual ;
    procedure ExecuteEx(Atask : TTask) ; virtual ;
    procedure Execute ; override ;
    constructor Create(ATaskManager : Tobject);
    destructor Destroy; override;
  end ;


implementation

{ TTaskListThread }

procedure TTaskListThread.AddTask(Atask: TTask);
begin
  //Fcs.Enter ;
  try
    Ftasklist.Add(Atask);
    FSemaphore.ReleaseSemaphore;
  finally
    //Fcs.Leave ;
  end ;
end;
procedure TTaskListThread.ClearList;
var
  Atask : TTask ;
begin
  //删除所有的任务
  while GetTask(Atask) do
  begin
    try
      Atask.Free ;
    finally
    end ;
  end;
end;

constructor TTaskListThread.Create(ATaskManager: Tobject);
begin
  inherited Create(True ) ;
  Ftasklist := TList.Create ;
  FSemaphore := TSemaphore.Create;
  Fcs := TCriticalSection.Create  ;
  FTaskManager := ATaskManager ;
end;

destructor TTaskListThread.Destroy;
begin
  //开始下一个循环
  Terminate ;
  //通知开始运行
  FSemaphore.ReleaseSemaphore ;
  //清除列表
  clearList ;
  //清除任务列表
  Ftasklist.Free ;
  FSemaphore.Free ;
  Fcs.free ;
  inherited;
end;

procedure TTaskListThread.Execute;
var
  Atask : TTask ;
begin
  //inherited;
  while not Terminated do
  begin
    Atask := nil ;
    WaitForSingleObject(FSemaphore.Handle, INFINITE);
    //再次判断是否要求退出
    if not Terminated  then
      while GetTask(Atask) do
      begin
        try
          if Atask <> nil  then
            ExecuteEx(Atask);
        except
          //出错的处理
        end ;
        Atask.Free ;
      end;     
  end ;
end;

procedure TTaskListThread.ExecuteEx(Atask : TTask);
begin

end;

function TTaskListThread.GetTask(var Atask: TTask): Boolean;
var
  i : integer ;
begin
  Result := False ;
  if FTasklist.Count > 0 then
  Begin
    Fcs.Enter ;
    try
      Atask :=  FTasklist.Items[0] ;
      Ftasklist.Delete(0);
      Result := True ;
    finally
      Fcs.Leave ;
    end ;
  end ;
end;


{ TLogTaskListThread }

 

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值