В моем OnExecute в C ++ Builder XE есть следующий код:
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
все остальные данные читаются очень очень быстро (от миллисекунды до субмиллисекунды).
Что может быть не так?
EDIT:
при запуске метода: AContext->Connection->IOHandler->InputBuffer->Size
равно 0. После первого чтения возвращается AContext->Connection->IOHandler->InputBuffer->Size
содержит то, что осталось в буфере после чтения. Таким образом, это означает, что OnExecute
вызывается до того, как какие-либо данные будут фактически доступны вызывающей стороне. Таким образом, 100-300 мс - это количество времени, которое требуется Indy для извлечения данных из сокета и помещения их в буфер после получения уведомления о поступлении данных. Это кажется слишком длинным.
EDIT:
удалено do{
, поскольку это подразумевало петлю, которой там не было.