-
Здравствуйте, подскажите что у меня идеалогически не правильно в этом коде. По одной команде шлю и получаю ответ без проблем. А вот если я хочу (точнее так нужно по заданию) отослать N команд и получить корректно на все ответы. Как корректно слать одну за одной команды, дожидаясь пока не отработает полностью предыдущая. Посылая несколько команд, теряю соединение, но иногда и проскакивает, менять CheckForDataOnSource(100); - не помогает. На сегодня имею примерно такой код:
...................Main Unit..................... procedure TMainForm.TraceIntoBtnClick(Sender: TObject); begin MyServer.FSendList.Add('command 0'); MyServer.FSendList.Add('command 1'); MyServer.FSendList.Add('command 3'); end;
...................My Server Unit................. var TotalStr: String; FSendList: TStringList; ................................................... procedure TMyServer.ParseRecv(RecvText: string); begin //к VCL компонентам не обращаюсь, иначе далею вызов этой процедуры из Execute //через TIdSync.Synchronize, а TotalStr в TIdSync передаю через свойсво;
FReady := True; end;
procedure TMyServer.Execute(AContext: TIdContext); var Buffer: TIdBytes; Size: Integer; RecvStr: string; begin Buffer := nil;
with AContext.Connection.IOHandler do begin CheckForDataOnSource(100); if not InputBufferIsEmpty then begin Size := StrToInt(ReadLn()); //читаю длинну пришедший данный от клиента в байтах InputBuffer.ExtractToBytes(Buffer); SetString(RecvStr, PAnsiChar(@Buffer[0]), Size); //собираем ответ от клиента кусками TotalStr := TotalStr + RecvStr; //FEndResponse = '</response>' //если ответ заканцивается на '</response>' то считаем ответ полностью полученным if ((Copy(FTotalStr, Length(FTotalStr) - Length(FEndResponse), Length(FEndResponse))) = FEndResponse) then begin ParseRecv(TotalStr); TotalStr := ''; end; end else begin // Если уз буфера все прочитанно и в списке есть еще команды, то шлем следующую if (FReady) and (FSendList.Count > 0) then begin FReady := False; Write(FSendList[0] + #0); //шлю команды из очереди FSendList.Delete(0); end; end; end; end;
|