线程池任务队列(六)

2014-11-24 10:13:24 · 作者: · 浏览: 7
hen
FOnListenInfo(self,IdleQueueCount,BusyQueueCount,TaskQueueCount);
end;

procedure TThreadPool.ClearQueue(var Queue: TWorkThreadQueue);
var
i:Integer;
sc:Integer;
begin
sc := Length(Queue);
for i := 0 to sc - 1 do
begin
TWorkThread(Queue[i]).Terminate;
PostNewTaskSign;
//TWorkThread(Queue[i]).Free; //如果FreeOnTerminate为TRUE就不要使用这句了。
end;
SetLength(Queue,0);
end;

procedure TThreadPool.SetMinNums(const Value: Integer);
begin
if Value = 0 then
FMinNums := PRE_NUM
else if FMinNums > Value then
begin
//先清容再创建
FMinNums := Value;
ClearQueue(IDleQueue);
end
else
FMinNums := Value;

CreateIdleThread(FMinNums);
Log.WriteLog('Reset MinNums Numbers is ' + inttostr(FMinNums) + ' .',lInfo);
end;


function TThreadPool.Smaller(const expresion: Boolean; const tureva lue,
falseva lue: Integer): Integer;
begin
if expresion then
result := tureva lue
else
result := falseva lue;
end;

procedure TThreadPool.DelQueueOfIndex(var Queue: TWorkThreadQueue;
const Index: Integer);
var
i:integer;
ic:integer;
begin
ic := Length(Queue);
for i := Index to ic - 1 do
Queue[i] := Queue[i+1];

setLength(Queue,ic-1);
end;

procedure TThreadPool.DelTaskOfIndex(var Queue: TWorkTaskQueue;
const Index: Integer);
var
i:integer;
ic:integer;
begin
ic := length(Queue);
for i := Index to ic -1 do
Queue[i] := Queue[i+1];

setLength(Queue,ic-1);
end;

procedure TThreadPool.MoveQueue(const wt: TWorkThread; flag: Integer);
var
k:integer;
begin
if flag = 0 then
begin
hIDleLock.Enter;
for k := Low(IdleQueue) to High(IdleQueue) do
begin
if IdleQueue[k]=wt then
begin
AddThreadToBusyQueue(wt);
DelQueueOfIndex(IdleQueue,k);
end;
end;
hIDleLock.Leave;
end
else
begin
hBusyLock.Enter;
for k := Low(BusyQueue) to High(BusyQueue) do
begin
if BusyQueue[k]=wt then
begin
AddThreadToIdleQueue(wt);
DelQueueOfIndex(BusyQueue,k);
end;
end;
hBusyLock.Leave;
end;
end;

function TThreadPool.SwitchTasks(const aTask, bTask: TWorkTask): Boolean;
var
aIndex,bIndex:Integer;
begin
Result := true;
hTaskLock.Enter;
aIndex := FindTask(aTask);
bIndex := FindTask(bTask);

if (aIndex = -1) or (bIndex = -1) then
begin
Result := false;
hTaskLock.Leave;
exit;
end;
switch(TaskQueue,aIndex,bIndex);
hTaskLock.Leave;
end;

function TThreadPool.TaskSzie(const Queue: TWorkTaskQueue): Integer;
begin
Result := Length(Queue);
end;

function TThreadPool.WaitAutoRecover(const curThread: TWorkThread): Boolean;
begin
Result := Waiting = curThread;
end;

procedure TThreadPool.CreateIdleThread(const Nums: Integer);
var
WorkThread:TWorkThread;
i:integer;
begin
hIDleLock.Enter;
for i := 0 to Nums - 1 do
begin
WorkThread := TWorkThread.Create(self);
WorkThread.FreeOnTerminate := true;
AddThreadToIdleQueue(WorkThread);
end;