TIdTCPClient ReadBytes 不重置缓冲区

TIdTCPClient ReadBytes does not reset the buffer

我使用工作线程通过 TIdTCPClient 读取数据,如其他文章所述。线程使用此命令获取数据:

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

其中 FClientTIdTCPClientFDataTIdBytes

这是阅读线程的全部Execute()方法:

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,还是我做错了什么?

AByteCount 参数设置为 -1 告诉 ReadBytes() 到 return 此时可用的任何字节,如果 [=13= 首先从套接字读取] 目前为空。

AAppend 参数设置为 False 告诉 ReadBytes() 使用 TIdBytes' 现有内存读取字节。如果 TIdBytes 的长度小于被 return 编辑的字节数,则长度会相应地扩展。但是,如果长度等于或大于,则保持不变。这允许您预分配缓冲区并重用它,而无需在每次读取时重新分配它。但是,这确实意味着如果长度大于被 returned 的字节数,则未读部分中的任何先前数据都将保持不变。

如果您将 AAppend 参数设置为 True,returned 字节将附加到 TIdBytes' 现有内存的末尾,将所有以前的数据留在TIdBytes 未受影响。

无论哪种方式,如果您希望 DataReceived() 方法接收仅包含新字节的新 FData,则必须在每次读取之前将其长度重置为 0。