【发布时间】:2015-06-25 22:56:36
【问题描述】:
我正在使用 TidTCPClient 打开一个到服务器的套接字连接。 服务器开始向我发送不同 XML 数据的音调。 但是 ReadLn 对我没有帮助,因为我不知道 xml 在哪里开始和停止。所以我决定使用 Capture。这工作正确。但正如我从文档捕获中读到的那样,它也调用了 ReadLn,这意味着它逐行读取。有时读取 30~40 行的 XML 需要 1~2 秒。所以我需要更快地阅读它。我可以使用 ReadStream 或其他任何有区别的东西吗?
我现在使用的代码:
procedure TfrmMain.ThreadRun(Sender: TIdThreadComponent);
var
FData: TStringList;
FMemory: TStringStream;
begin
if Client.Connected = False then Exit;
FData := TStringList.Create;
Client.IOHandler.Capture(FData, '', False);
FMemory := TStringStream.Create('',TEncoding.UTF8);
FMemory.WriteString(FData.Text);
CoInitialize(Nil);
QInsert.ParamByName('XMLData').LoadFromStream(FMemory,ftBlob);
QInsert.Execute;
CoUninitialize;
FMemory.Free;
FData.Free;
end;
如您所见,我将 XML 数据插入到本地表中,这非常快,15ms ~ 60ms 取决于 XML 的大小,但获取数据真的很痛苦。
【问题讨论】:
-
你能提供一个你试图读取的 TCP 数据的例子吗?请说明如何在 TCP 流中分隔多个 XML 文档(如果有的话)。
-
顺便说一句,您的
CoInitialize()和CoUninitialize()调用属于TIdThreadComponent的OnBeforeRun和OnAfterRun事件,而不是OnRun事件。跨度> -
感谢 CoInitialize() 和 CoUninitialize() 警告。我已经解决了。