{
任务队列过程 对于任务的处理采用单独的线程 和任务列表进行处理
}
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.