Forráskód Böngészése

BeginUpdate/EndUpdate guard added in e23d0540 degrades performance

Source commit: cfeccb98861f0ecdcd4408b0ab3b61f5443b0d83
Martin Prikryl 1 éve
szülő
commit
11ad19c569
1 módosított fájl, 39 hozzáadás és 42 törlés
  1. 39 42
      source/packages/filemng/DriveView.pas

+ 39 - 42
source/packages/filemng/DriveView.pas

@@ -1850,58 +1850,55 @@ begin
   DosError := FindFirst(ApiPath(IncludeTrailingBackslash(Path) + SpecificFile), DirAttrMask, SRec);
   Start := Now;
   C := 0;
-  // At least from SetDirectory > DoFindNodeToPath, this is not called within BeginUpdate/EndUpdate block.
-  // No noticeable effect seen (possibly because the node is collapsed), but it makes sense in general.
-  Items.BeginUpdate;
-  try
-    while DosError = 0 do
+  // At least from SetDirectory > DoFindNodeToPath and CanExpand, this is not called within BeginUpdate/EndUpdate block.
+  // But in any case, addinf it here makes expanding (which calls CanExpand) noticeably slower, when there are lot of nodes,
+  // because EndUpdate triggers TVN_GETDISPINFO for all nodes in the tree.
+  while DosError = 0 do
+  begin
+    if (SRec.Name <> '.' ) and
+       (SRec.Name <> '..') and
+       (SRec.Attr and faDirectory <> 0) then
     begin
-      if (SRec.Name <> '.' ) and
-         (SRec.Name <> '..') and
-         (SRec.Attr and faDirectory <> 0) then
+      NewNode := AddChildNode(Node, SRec);
+      Inc(C);
+      if DoScanDir(NewNode) then
       begin
-        NewNode := AddChildNode(Node, SRec);
-        Inc(C);
-        if DoScanDir(NewNode) then
-        begin
-          // We have seen the SFGAO_HASSUBFOLDER to be absent on C: drive $Recycle.Bin
-          NewNode.HasChildren := Bool(TNodeData(NewNode.Data).shAttr and SFGAO_HASSUBFOLDER);
-
-          TNodeData(NewNode.Data).Scanned := not NewNode.HasChildren;
-        end
-          else
-        begin
-          NewNode.HasChildren := False;
-          TNodeData(NewNode.Data).Scanned := True;
-        end;
-
-        // There are two other directory reading loops, where this is not called
-        if ((C mod 100) = 0) and Assigned(OnContinueLoading) then
-        begin
-          Stop := False;
-          OnContinueLoading(Self, Start, Path, C, Stop);
-          if Stop then DosError := 1;
-        end;
+        // We have seen the SFGAO_HASSUBFOLDER to be absent on C: drive $Recycle.Bin
+        NewNode.HasChildren := Bool(TNodeData(NewNode.Data).shAttr and SFGAO_HASSUBFOLDER);
 
-        Result := True;
+        TNodeData(NewNode.Data).Scanned := not NewNode.HasChildren;
+      end
+        else
+      begin
+        NewNode.HasChildren := False;
+        TNodeData(NewNode.Data).Scanned := True;
       end;
 
-      if DosError = 0 then
+      // There are two other directory reading loops, where this is not called
+      if ((C mod 100) = 0) and Assigned(OnContinueLoading) then
       begin
-        DosError := FindNext(SRec);
+        Stop := False;
+        OnContinueLoading(Self, Start, Path, C, Stop);
+        if Stop then DosError := 1;
       end;
-    end; {While DosError = 0}
 
-    FindClose(Srec);
+      Result := True;
+    end;
 
-    if All then TNodeData(Node.Data).Scanned := True;
+    if DosError = 0 then
+    begin
+      DosError := FindNext(SRec);
+    end;
+  end; {While DosError = 0}
+
+  FindClose(Srec);
+
+  if All then TNodeData(Node.Data).Scanned := True;
+
+  if Result then SortChildren(Node, False)
+    else
+  if All then Node.HasChildren := False;
 
-    if Result then SortChildren(Node, False)
-      else
-    if All then Node.HasChildren := False;
-  finally
-    Items.EndUpdate;
-  end;
   Application.ProcessMessages;
 end; {ReadSubDirs}