type
TIdThreadMgrDefault = class(TIdThreadMgr)
public
function GetThread: TIdThread; override;
procedure ReleaseThread(AThread: TIdThread); override;
end;
implementation
uses
IdGlobal;
{ TIdThreadMgrDefault }
function TIdThreadMgrDefault.GetThread: TIdThread;
begin
Result := CreateNewThread;
ActiveThreads.Add(result);
end;
procedure TIdThreadMgrDefault.ReleaseThread(AThread: TIdThread);
begin
if not IsCurrentThread(AThread) then begin
// Test suspended and not stopped - it may be in the process of stopping.
if not AThread.Suspended then begin
AThread.TerminateAndWaitFor;
end;
AThread.Free;
end else begin
AThread.FreeOnTerminate := True;
AThread.Terminate; //APR: same reason as MgrPool. ELSE threads leak if smSuspend
end;
ActiveThreads.Remove(AThread);
end;
关于linuxping说的,少数几行代码实现强大功能的情况,那是建立在Indy使用了非常多的设计模式的情况之下,所以简化了继承类的代码量,这也是非常常见的一种情况。Indy本身的framework就非常优秀,值得所有学习delphi的人学习它!Indy的代码质量也很不错,只是由于人手不够的缘故,Indy在开发上进度缓慢,当Borland需要发布delphi的时候,Indy甚至还未完成全部工作,所以导致Delphi自带的Indy有许多bug。这是一件非常遗憾的事情。但是瑕不遮玉,Indy整体的架构非常好,整个都可以看做一个framework来独立演化,并且在SuperCore中甚至实现了IOCP等诸多高级功能(可惜的是,负责开发SuperCore的Chad Z. Hower (aka Kudzu)因工作繁忙已经有1年多没有更新SuperCore了,导致其与Indy其他部分的开发严重脱节,现在SuperCore都无法使用了!)。