indy10 里面的每个客户端都对应一个tidcontext,发送数据的时候 acontext.connection.iohandler.write 或 acontext.iohandler.write   connection和indy10里面的线程池有关系么?iohandler 又起什么作用?能说说10里面的线程池的原理么?谢谢大家

解决方案 »

  1.   

    INDY 10是每个连接一个线程,没有线程池,IOHandler是对SOCKET进行封装。
      

  2.   


    错!
    indy10是支持线程池的,indy是一个连接一个线程没错,IndyTcpserver的线程管理创建由其属性Scheduler负责,Scheduler的两个派生类:
    TIdSchedulerOfThreadDefault
    TIdSchedulerOfThreadPool
    其中,默认(也就是未Scheduler属性的nil的时候)是使用TIdSchedulerOfThreadDefault,他不支持线程池;
    如果要使用线程池,你就需要自己从indy misc面板拖拉一个TIdSchedulerOfThreadPool控件下来,并将其设定给IndyTcpserver的Scheduler属性。因为indy是一个连接一个线程,因此,最大线程数就由IndyTcpserver的maxConnections决定。
    当连接关闭是,线程并不会结束,而是挂起(也就是不占用cpu资源),当有新连接进来是,先从线程池中判断有没有挂起的线程,如果有,则唤醒他用来处理这个新的连接,如果没有,则创建一个新线程。无论如何,连接数到达maxConnections是,线程池也无能为力。直接拒绝连接。
      

  3.   

    ioHandler是专门用量socket读写的,概念上跟线程无关
      

  4.   

    to truexf
    那它还是一个连接一个线程哦????这个indy10 tcpserver能支持的客户端数大概是多少呢??
      

  5.   

    是的。一个连接一个线程。
    如果你应用想支持超大并行连接数,用indyserver可能就不合适。虽然线程的资源耗费很少,但总是要耗费资源的。如果你的进程中线程数达到上千个,cpu花在线程切换上的耗费就相当大了。但是普通的socket应用都没有这么大连接数的要求。用indy是可以满足的。另外要明白一点:
    连接数不等于负荷能力。
    如果创建1000个连接,而且每个连接的数据传输都很忙碌,那就涉及到硬件资源和网络带宽了。如果负荷不来的话照样崩溃。
    所以无法简单的说indy能支持多大的并发数是视实际情况而定的。如果真的对并发数要求很高的话,那就不要用indy了。自己用api以完成端口的模式编程,iocp是公认windows上的效能最高的,但是他也只是一个比较好的socket编程模式而已。具体能支持多大的符合总是由各方面因素综合而决定。
      

  6.   

    truexf说的有道理,我一直认为INDY的线程池是个鸡肋,就算是在INDY 10中加了千程,也不行。如果要实现线程池,建议使用Windows提供的完成端口模型IOCP,这个才是管理SOCKET比较好的方式,也符合线程池的思想。