Ну, самый простой обработчик onExecute, который у меня есть, выглядит следующим образом. (извините C ++ вместо Delphi, но вы поймете идею.
void __fastcall MyPanel::DoTCPExecute(TIdPeerThread * AThread)
{
AnsiString text =AThread->Connection->ReadLn();
// now do something with text
}
Единственная очевидная проблема, которую я вижу, это то, что вы пытаетесь использовать «синхронизацию» данных, чтобы определить, когда у вас есть полная строка. Это настоящее нет-нет с TCP. У вас может быть только первый байт строки, или вы можете отправить сразу несколько строк. С TCP нет гарантии, что каждое «send» закончится как одиночное «receive» на другом конце.
Вам необходимо «разделить» вашу строку другим способом. Readln использует символ новой строки в качестве терминатора - другой подход заключается в добавлении префикса к каждой части данных в поле длины. Вы читаете длину, а затем читаете оставшиеся данные.