我在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{
,因为它暗示了一个不存在的循环。
答案 0 :(得分:0)
OnExecute
事件根本没有绑定到套接字缓冲区。 TIdTCPServer
在调用OnExecute
事件后立即开始调用OnConnect
,并在无限循环中继续调用OnExecute
,直到客户端断开连接(换句话说,您不应该循环)你自己在OnExecute
处理程序内部。读取数据包,处理,退出,等待下一个事件,重复)。
你是正确的InputBuffer
可能比你在代码中要求的要大。所有IOHandler
的读取方法仅从InputBuffer
获取数据,而不是直接从套接字获取数据。如果InputBuffer
没有足够的字节缓存来满足读取请求,则IOHandler
将等待套接字上的字节可用,然后将所有字节读入{{1以后用。这最大限度地减少了需要访问套接字的频率,并有助于使套接字响应新数据。