我使用工作线程通过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
,而TIdTCPClient
是FData
。
这是读取线程的整个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,还是我做错了什么?
答案 0 :(得分:2)
将AByteCount
参数设置为-1
告诉ReadBytes()
返回当时可用的任何字节,如果InputBuffer
当前为空,则首先从套接字读取。 / p>
将AAppend
参数设置为False告诉ReadBytes()
使用TIdBytes
的现有内存读取字节。如果TIdBytes
的长度小于要返回的字节数,则将相应地扩展长度。但是,如果长度相等或更大,则保持不变。这使您可以预分配缓冲区并重用它,而无需在每次读取时重新分配它。但是,这确实意味着,如果长度大于要返回的字节数,则未读部分中的所有先前数据都将保持不变。
如果将AAppend
参数设置为True,则返回的字节将附加到TIdBytes
现有内存的末尾,而TIdBytes
中所有先前的数据都保持不变。
无论哪种方式,如果要让DataReceived()
方法接收仅包含新字节的新鲜FData
,则必须在每次读取之前将其长度重置为0。