请问TIdThreadMgrDefault和IdThreadMgrPool控件有什么用的? ( 积分: 50 )

  • 主题发起人 主题发起人 zhou13
  • 开始时间 开始时间
Z

zhou13

Unregistered / Unconfirmed
GUEST, unregistred user!
今天开了Indy的Demo,发现TIdThreadMgrDefault这个控件。
Demo里好像没有用它的任何东西,为什么要加这个控件呢?
它是干什么用的呢?
如果不加它又会怎么样呢?程序死掉?
 
我菜啊,这种问题应该都知道吧?
别瞧不起菜鸟啊
 
线程池~~
~~负责创建和释放线程.~并把创建的线程存起来(不是释放),下次要用到的时候直接从线程池里面取出来~~~

原代码就几十行~看看不就是了~~

我喜欢indy的代码~很短的代码就实现了功能~
 
谢谢你那么玩还来帮忙回答问题

“原代码就几十行~看看不就是了~~"
源代码在哪里呢?IdTCPDemo?
我感觉就是把TIdThreadMgrDefault控件删了,程序还是能用,还能多人聊天,这是为什么?
 
unit IdThreadMgrDefault;

interface

uses
IdThread, IdThreadMgr;

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;

end.
===================================================
 
唉,水平差,看不懂,能不能给一个具体应用的例子

实在是看不懂

CreateNewThread函数是用来干吗的
 
CreateNewThread都已经很明白的表达意思了
创建新线程
TIdThreadMgrDefault是TIdThreadMgrPool的父类,TIdThreadMgrDefault是默认设置,请求一来,就创建一个新线程执行任务,任务执行完毕后,销毁这个线程;TIdThreadMgrPool是建立一个线程缓冲池,当缓冲池创建的时候,根据PoolSize创建线程对象,并立刻挂起它们,直到有请求到达的时候,从池中取出对象,执行任务,执行完毕放回池中,如果请求过多,池里面已经没有空闲的等待线程对象,则创建新线程对象执行任务.......
兄弟看看Indy的Document啊,里面有详细解释
 
讲了那么多,还是太抽象

是不是把它放到程序里面,它就灰自动管理的???

如果没有这个控件,程序会丢失什么功能吗????

埃,到现在还没搞懂
 
TIdThreadMgrDefault是默认的线程管理类,这个类在客户端有请求到达服务器的时候,生成一个新线程处理客户端的请求,在客户端退出后,销毁这个线程。TIdThreadMgrPool是线程管理类,从TIdThreadMgrDefault继承,其实现了线程池的功能,当服务器端启动的时候,根据TIdThreadMgrPool.PoolSize一次生成PoolSize表示的线程数量,然后放入线程池内等待调用。当客户端连接上服务器端的时候,从线程池中取出一个等待线程,激活它并允许它为新连接的客户端服务,此时这个服务线程被标记为占用;客户端退出后,线程被标记为空闲,再次放回线程池等待其它客户端连接的时候重用。如果在服务器端,你没有关联TIdThreadMgrDefault对象的话,在服务器启动的时候,会自动生成一个TIdThreadMgrDeafult对象来负责处理线程管理的。所以你即使删掉这个TIdThreadMgrDefault也不会影响服务器行为。

关于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都无法使用了!)。
 
呵呵,回了帖子才发现,我原来之前已经回答过这个帖子了!!!郁闷,丢人了!!!
 
关于Indy的详细资料,楼主可参考如下在线文档(英文的):

http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=index.html

你别说不懂英文,不懂就去学,如果学编程连英文都不好的话,那还是趁早改行的好。
 
不错,谢谢了

另外,我英文没你说的那么差
 
多人接受答案了。
 
后退
顶部