关于Delphi中Indy控件,TCP通信实时性问题。
Indy的TCP通信,最常采用的是阻塞方式。也就是说,如果是TCP的客户端,需要一个子线程来查询是否有数据到达。服务器端是由Indy的Server自己生成一个子线程,然后在子线程中循环调用回调函数(事件),实现事件的响应模式,对使用者来讲,和其他控件的事件响应编程方法一致。
虽然编程方法一致,但是有个问题,就是线程的执行效率的问题。具体的来说,就是CPU占用比问题。
首先,从客户端来看,需要生成一个子线程来判断是否有数据达到。在子线程的循环中,
Indy9通常采用
BufferLen := FIdTCPClient1.ReadFromStack(false,-1,false);
来取得是否有数据到达,当BufferLen大于0时,再采用
FIdTCPClient1.ReadBuffer函数取得数据
Ndy10中没有了