destructor TThreadPool.Destroy;
begin
while FServerObjects.Count > 0 do
begin
Dispose(PServerObject(FServerObjects[0]));
FServerObjects.Delete(0);
end;
FreeAndNil(FServerObjects);
FreeAndNil(FCriticalSection);
inherited Destroy;
end;
procedure TThreadPool.Init;
var
i: integer;
p: PServerObject;
begin
if not Assigned(FServerObjects) then
exit;
for i := 1 to FPoolSize do
begin
New(p);
if Assigned(p) then
begin
p^.ServerObject := TWorkThread.Create;
p^.InUse := False;
FServerObjects.Add(p);
end;
end;
end;
function TThreadPool.Lock: TWorkThread;
var
i: integer;
begin
Result := nil;
try
FCriticalSection.Enter;
try
for i := 0 to FServerObjects.Count - 1 do
begin
if (not PServerObject(FServerObjects[i])^.InUse) then
begin
PServerObject(FServerObjects[i])^.InUse := True;
Result := PServerObject(FServerObjects[i])^.ServerObject;
Break;
end;
end;
finally
FCriticalSection.Leave;
end;
except
on E: Exception do
begin
LogInfo('TThreadPool.Lock' + E.Message);
exit;
end;
end;
end;
procedure TThreadPool.Unlock(Value: TWorkThread);
var
i: integer;
begin
if not Assigned(Value) then
exit;
try
FCriticalSection.Enter;
try
for i := 0 to FServerObjects.Count - 1 do
begin
if Value = PServerObject(FServerObjects[i])^.ServerObject then
begin
PServerObject(FServerObjects[i])^.InUse := False;
// Value.Suspended := True;
Value.ThreadMethod := nil;
Break;
end;
end;
finally
FCriticalSection.Leave;
end;
except
on E: Exception do
begin
LogInfo('TThreadPool.Unlock' + E.Message);
exit;
end;
end;
end;
destructor TWorkThread.Destroy;
begin
CloseHandle(FEvent);
inherited;
end;
procedure TWorkThread.Execute;
begin
inherited;
while not Terminated do
if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then
if Assigned(FThreadMethod) then
if Fsync then
Synchronize(FThreadMethod)
else
FThreadMethod;
end;
procedure TWorkThread.Run;
begin
PulseEvent(FEvent);
end;