TIdTCPClient ReadBytes不会重置缓冲区

时间:2019-03-28 11:23:12

标签: delphi indy

我使用工作线程通过let formatter = PersonNameComponentsFormatter() if let components = formatter.personNameComponents(from: name) { formatter.style = .abbreviated return formatter.string(from: components) } 读取数据,如其他文章所述。线程使用以下命令获取数据:

TIdTCPClient

其中FClient.IOHandler.ReadBytes (FData,-1,False); FClient,而TIdTCPClientFData

这是读取线程的整个TIdBytes方法:

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)。在其他讨论中我从未读过它。

我正在使用Delphi RAD Studio 10.3。

是否知道必须将FData设置为0,还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

AByteCount参数设置为-1告诉ReadBytes()返回当时可用的任何字节,如果InputBuffer当前为空,则首先从套接字读取。 / p>

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

如果将AAppend参数设置为True,则返回的字节将附加到TIdBytes现有内存的末尾,而TIdBytes中所有先前的数据都保持不变。

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