TIdTCPClient ReadBytes 不重置缓冲区
TIdTCPClient ReadBytes does not reset the buffer
我使用工作线程通过 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)
,那么下一个传入数据将附加到 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。
我使用工作线程通过 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)
,那么下一个传入数据将附加到 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。