TIdTCPClient ReadBytes не сбрасывает буфер - PullRequest
0 голосов
/ 28 марта 2019

Я использую рабочий поток для чтения данных с TIdTCPClient, как описано в других статьях.Поток получает данные с помощью этой команды:

FClient.IOHandler.ReadBytes (FData,-1,False);

, где FClient - это TIdTCPClient, а FData - TIdBytes.

Это целое потока чтения * 1011.* method:

procedure TReadingThread.Execute;
begin
  inherited;
  if not assigned(FClient.IOHandler) then exit;
  while not terminated do
  begin
    if FClient.IOHandler <> nil then
    begin
      try
        FClient.IOHandler.ReadBytes (FData,-1,False);
        Synchronize(DataReceived);

        SetLength (FData,0);

      except
      end;
    end;
  end;
end;

Если я не использую SetLength (FData,0), то следующие входящие данные добавляются к FData.Я никогда не читал об этом в других обсуждениях.

Я использую Delphi RAD Studio 10.3.

Известно ли, что FData должен быть установлен в 0, или я делаю что-то не так?

1 Ответ

2 голосов
/ 28 марта 2019

Установка параметра AByteCount на -1 говорит ReadBytes(), что нужно возвращать все байты, доступные в данный момент, сначала считывая данные из сокета, если InputBuffer в данный момент пуст.

Установка для параметра AAppend значения False указывает ReadBytes() на использование существующей памяти TIdBytes для чтения байтов. Если длина TIdBytes меньше количества возвращаемых байтов, длина соответственно увеличивается. Но, если длина равна или больше, она остается нетронутой. Это позволяет вам предварительно выделить буфер и повторно использовать его без перераспределения при каждом чтении. Но это означает, что если длина больше, чем число возвращаемых байтов, любые предыдущие данные в непрочитанной части остаются нетронутыми.

Если вместо этого для параметра AAppend установлено значение True, возвращаемые байты добавляются в самый конец существующей памяти TIdBytes, оставляя все предыдущие данные в TIdBytes нетронутыми.

В любом случае, если вы хотите, чтобы ваш DataReceived() метод получил новый FData, содержащий только новые байты, вы должны сбросить его длину до 0 перед каждым чтением.

...