晚上没事在机器上乱翻,竟然无意间发现ISAPIThreadPool.pas这个文件当中采用的是IOCP,而之前却有好些人都为实现这个东西做了不少功夫。发此贴,只是希望这个“现成的东西”对某些朋友有用的,并且加以提示一下。不过也许对我来说也有一小点点帮助,相对来讲这个还是显得比较简单一点,至少比Indy显得简单。或者我也不需要再一味着把之前采用Cpp写的代码又重新翻译一遍成Delphi^_^。

解决方案 »

  1.   

    问些问题,俺一直不得解:
    这个WSASend投递后的PerHandleData,如果在GetQueuedCompletionStatus没有返回,这个本来是正常的,但如果一直不返回的话,就可能造成出错,有没有办法Cancel掉了?或者说怎么办了这种情况
    多谢。
      

  2.   

    对于WSASend没有返回,通常有可能是提交的时候本身就没有成功,提交的这种操作,想要Cancel,最简单的就是把提交这个操作的线程结束掉(貌似代价不小)。建议先判断WSASend提交时的有没有成功,当时是否有线程处于GetQueuedCompletionStatus的等待状态。
      

  3.   

    对了,可能发贴的时候说明得有点可能让人误会。1.并不是说Indy本身就有实现IOCP;
    2.ISAPIThreadPool当中只是简单地演示了IOCP的使用(其实就是线程池),但是并没有绑定任何的网络端口用于数据的传输。
      

  4.   

    老僵:近来可好?目前公司来说还用不到,即使以后产品升级估计都不需要用到IOCP
      

  5.   

    回安安:还好还好,比较郁闷的是,年前的那个项目至今还没有正式交货...
    Indy 10本身是可以实现IOCP,但是并没有看哪有现成的IOCP代码。