2011-02-16 63 views
0

我在C++ Builder中XE OnExecute下面的代码:印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{因为它意味着一个循环,是不存在。

回答

0

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

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

+0

对不起,`do {`暗示着一个不存在的循环。我不会在`OnExecute`循环,我使用`do {} while(false);`提前退出。数据到达时调用OnExecute,是否正确?但在调用“OnExecute”之后,仍需要100到300 ms才能获得第一个数据。我不记得这发生在C++ Builder 2010中。 – 2011-02-16 14:05:14