0

我在 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 毫秒是 Indy 从套接字获取数据并在收到数据到达通知后将其放入缓冲区所花费的时间。这似乎太长了。

编辑:

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

4

1 回答 1

0

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

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

于 2011-02-16T08:53:41.307 回答