• kashey © (02.11.18 14:18) [0]
    Здравствуйте, подскажите что у меня идеалогически не правильно в этом коде.
    По одной команде шлю и получаю ответ без проблем. А вот если я хочу (точнее так нужно по заданию) отослать 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;
Есть новые Нет новых   [118685   +13][b:0][p:0]