Delphi Indy OnExecute先读慢 我在C++ Builder XE:< /P>中的OnExc执行中有以下代码 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 ); ...

Delphi Indy OnExecute先读慢 我在C++ Builder XE:< /P>中的OnExc执行中有以下代码 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 ); ...,delphi,c++builder,indy,indy10,Delphi,C++builder,Indy,Indy10,该日志从获取命令100毫秒开始,在应用程序运行的其余部分,它会爬行到300毫秒。我认为一旦数据进入缓冲区,就会调用OnExecute,那么为什么第一次读取需要100到300毫秒才能成功呢 在第一次读取相同的数据后,所有其他数据都会以毫秒到亚毫秒的速度快速读取 出了什么问题 编辑: 方法启动时:AContext->Connection->IOHandler->InputBuffer->Size为0。第一次读取后返回AContext->Connection->IOHandler->InputBuff

该日志从获取命令100毫秒开始,在应用程序运行的其余部分,它会爬行到300毫秒。我认为一旦数据进入缓冲区,就会调用OnExecute,那么为什么第一次读取需要100到300毫秒才能成功呢

在第一次读取相同的数据后,所有其他数据都会以毫秒到亚毫秒的速度快速读取

出了什么问题

编辑:

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

编辑:

移除do{因为这意味着一个不存在的循环。

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


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

抱歉,do{表示循环不存在。我不在OnExecute中循环,我使用do{}当数据到达时调用OnExcRead,这是正确的吗?但是在调用OnExcRePATH之后,仍然需要100到300 ms来获取第一个数据。我不记得在C++ Builder 2010中出现的情况。不,OnExecute在数据到达时没有被调用。在连接的整个生命周期中,不考虑任何数据,都会出现无止境的循环。OnExecute处理程序负责根据需要管理数据操作。调用OnExecute时,TIdTCPServer希望处理程序根据需要阻止调用线程,并在需要时让步,但TIdTCPServer本身不会做更多的事情从2010年到XE,印地在这方面没有任何变化。它一直是这样运作的。是的,我误解了你的第一篇帖子。“不管任何数据”为我解决了这个问题。