Treeview保存/加载到xml的速度太慢
目前,treeview中有大约40000个节点,这是XE6的标准TTreeView。 问题在于,保存/加载需要很长时间(大约2分钟),并且节点数量预计将在未来增长 你对提高速度有什么看法?除了xml,还有其他保存/加载方式吗?还有其他treeview组件吗 编辑:好的,全部真相,除了真相什么都没有。我只是测量了(没有使用奇特的仪器,只有一个密西西比河,两个密西西比河,…)负载/节省时间。保存时间约为5秒,加载时间略少于5秒。它感觉非常迟钝,反应迟钝,我觉得它花了2分钟 谢谢 代码:Treeview保存/加载到xml的速度太慢,xml,delphi,treeview,Xml,Delphi,Treeview,目前,treeview中有大约40000个节点,这是XE6的标准TTreeView。 问题在于,保存/加载需要很长时间(大约2分钟),并且节点数量预计将在未来增长 你对提高速度有什么看法?除了xml,还有其他保存/加载方式吗?还有其他treeview组件吗 编辑:好的,全部真相,除了真相什么都没有。我只是测量了(没有使用奇特的仪器,只有一个密西西比河,两个密西西比河,…)负载/节省时间。保存时间约为5秒,加载时间略少于5秒。它感觉非常迟钝,反应迟钝,我觉得它花了2分钟 谢谢 代码: proced
procedure TTree.Save(aTreeView:TTreeView;aFilePath:String);
变量
三电极:三电极;
oXMLDocument:IXMLDocument;
oXMLNode:IXMLNode;
过程ProcessTreeItem(aTreeNode:TTreeNode;aXMLNode:IXMLNode);
变量
oTemp:IXMLNode;
开始
如果(aTreeNode=nil),则退出;
oTemp:=aXMLNode.AddChild('item');
oTemp.Attributes['text']:=aTreeNode.text;
oTemp.Attributes['NodeID']:=TNode(aTreeNode.Data).ID;
oTemp.Attributes['NodeType']:=TNode(aTreeNode.Data).NodeType;
oTemp.Attributes['Selected']:=aTreeNode.Selected;
aTreeNode:=aTreeNode.getFirstChild;
当一个无节点开始时
ProcessTreeItem(aTreeNode,oTemp);
aTreeNode:=aTreeNode.getNextSibling;
结束;
结束;
开始
oXMLDocument:=NewXMLDocument;
选项:=[doNodeAutoIndent];
oXMLNode:=oXMLDocument.AddChild('xml');
OthereNode:=aTreeView.TopItem;
当三端零开始时
ProcessTreeItem(oTreeNode,oXMLNode);
oTreeNode:=oTreeNode.getNextSibling;
结束;
oXMLDocument.SaveToFile(文件路径);
结束;
过程TTree.Load(aTreeView:TTreeView;aFilePath:String);
变量
oXMLNode:IXMLNode;
oXMLDocument:IXMLDocument;
过程进程节点(aXMLNode:IXMLNode;aTreeNode:TTreeNode);
变量
扩展:布尔型;
oNodeData:TNode;
oTemp:IXMLNode;
开始
如果aXMLNode=nil,则退出;
oNodeData:=CreateNode(整数(aXMLNode.Attributes['NodeID']),aXMLNode.Attributes['NodeType']);
aTreeNode:=aTreeView.Items.AddChildObject(aTreeNode,aXMLNode.Attributes['text'],oNodeData);
aTreeNode.Selected:=aXMLNode.Attributes['Selected'];
oTemp:=aXMLNode.ChildNodes.First;
而oTemp nil确实开始了
ProcessNode(oTemp,aTreeNode);
oTemp:=oTemp.NextSibling;
结束;
结束;
开始
aTreeView.Items.Clear;
oXMLDocument:=NewXMLDocument;
LoadFromFile(aFilePath);
oXMLNode:=oXMLDocument.DocumentElement.ChildNodes.First;
而oXMLNode nil不开始
ProcessNode(oXMLNode,nil);
oXMLNode:=oXMLNode.NextSibling;
结束;
结束;
查看您的代码时,我错过了开始更新/结束更新。这可以大大提高速度
aTreeView.Items.BeginUpdate;
try
// clear and add your items here
finally
aTreeView.Items.EndUpdate;
end;
谢谢你的评论,塞巴斯蒂安。我在调用加载过程时有这些。我猜效果是一样的?如果在调用加载过程之前调用BeginUpdate,那就足够了。但我只能对我看到的代码发表评论。顺便说一句:在我的电脑上向VCL TTreeView添加40000个项目需要2秒钟。这是一个真正的应用程序还是你刚刚制作了一个测试应用程序?这不是。如果添加40000个节点需要2秒钟,那就没什么好说的了。@Mike不是一个测试应用程序,探索这一点需要什么?
aTreeView.Items.BeginUpdate;
try
// clear and add your items here
finally
aTreeView.Items.EndUpdate;
end;