Indy OnExecute首先读慢

时间:2011-02-16 01:57:15

标签: delphi c++builder indy indy10

我在C ++ Builder XE中的OnExecute中有以下代码:

void __fastcall Test::TestExecute( TIdContext* AContext )
{
   try
   {
      // get the command directive
      DWORD startTime = timeGetTime( );
      UnicodeString DBCommand = AContext->Connection->IOHandler->ReadChar();
      DWORD endTime = timeGetTime();
      UnicodeString log;
      log.printf( L"getting command %d ms", endTime - startTime );
      Log( log );
      ...

日志从获取命令100毫秒开始,然后爬到300,然后它将用于其余的应用程序运行。我认为一旦数据在缓冲区中就调用了OnExecute,那么为什么第一次读取成功需要100到300毫秒呢?

在第一次读取同一OnExecute之后,所有其他数据的读取速度非常快(毫秒到亚毫秒)。

可能出现什么问题?

编辑:

在方法启动时:AContext->Connection->IOHandler->InputBuffer->Size为0.在第一次读取后返回AContext->Connection->IOHandler->InputBuffer->Size包含在读取后保留缓冲区的内容。因此,这意味着在任何数据实际可供调用者使用之前调用OnExecute。因此100-300 ms是Indy从套接字获取数据并在收到数据到达通知后将其放入Buffer中的时间。这似乎太长了。

编辑:

已移除do{,因为它暗示了一个不存在的循环。

1 个答案:

答案 0 :(得分:0)

OnExecute事件根本没有绑定到套接字缓冲区。 TIdTCPServer在调用OnExecute事件后立即开始调用OnConnect,并在无限循环中继续调用OnExecute,直到客户端断开连接(换句话说,您不应该循环)你自己在OnExecute处理程序内部。读取数据包,处理,退出,等待下一个事件,重复)。

你是正确的InputBuffer可能比你在代码中要求的要大。所有IOHandler的读取方法仅从InputBuffer获取数据,而不是直接从套接字获取数据。如果InputBuffer没有足够的字节缓存来满足读取请求,则IOHandler将等待套接字上的字节可用,然后将所有字节读入{{1以后用。这最大限度地减少了需要访问套接字的频率,并有助于使套接字响应新数据。