Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Kann ich meine ListView beschleunigen (Icon laden dauert ewig) (https://www.delphipraxis.net/198553-kann-ich-meine-listview-beschleunigen-icon-laden-dauert-ewig.html)

KodeZwerg 13. Nov 2018 12:16

Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
So sieht meine füll routine aus:
Delphi-Quellcode:
in .dfm
  object FileIcons: TImageList
    BlendColor = clGradientInactiveCaption
    BkColor = 15918295
    Masked = False
    Left = 632
    Top = 32
  end

...
    FileIcons: TImageList;
...

procedure DoIt();
var
  i: Integer;
  SL2: TStringDynArray;
  SL2idx: Integer;
  Icon: TIcon;
  dummy: Word;
begin
  dummy := 0;
  SL2idx := 0;
  SetLength( SL2, 1 );

...code um SL zu füllen...

  if SL2idx > 0 then   Dec( SL2idx );
  SetLength( SL2, SL2idx );
  Icon := TIcon.Create;
  Icon.Transparent := True;
  lvFiles.Items.BeginUpdate;
  for i := 0 to Length( SL2 ) -1 do
    with lvFiles.Items.Add() do
      begin
        if cbUseIcons.Checked then
          Icon.Handle := ExtractAssociatedIcon( hInstance, PWideChar( SL2[ i ] ), dummy );
        Icon.Transparent := True;
        ImageIndex := FileIcons.AddIcon( Icon );
        DestroyIcon( Icon.Handle );
        Caption := SL2[ i ];
    end;
  lvFiles.Items.EndUpdate;
  Icon.Free;
end;
Lasse ich das Icon laden weg = hab ich fast sofort die Ergebnisse dargestellt
Nehm ich Icon mit rein dauert es teilweise ewig.

Mach ich da was falsch?

DieDolly 13. Nov 2018 12:21

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Lädst du mit ExtractAssociatedIcon ein Icon einer Datei? Wenn ja liegt es an diesen IO-Zugriffen. SHGetFileInfo ist eventuell schneller.
Besser ist es aber die Icons schon vorher in eine ImageList zu laden und dann direkt von der ImageList ins ListView zu transportieren.

Delphi.Narium 13. Nov 2018 12:33

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Daten- / Iconmenge?

Programm beim Laden der Icons minimieren, damit nicht dauernd "neu gemalt" wird.

irgendwie sowas:
Delphi-Quellcode:
  Application.Minimize;
  lvFiles.Items.BeginUpdate;
...
  lvFiles.Items.EndUpdate;
  Application.Restore;
Die Bildschirmausgabe ist nachwievor das Langsamste bei Programmen ;-)

DieDolly 13. Nov 2018 12:37

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Zitat:

Programm beim Laden der Icons minimieren, damit nicht dauernd "neu gemalt" wird.
Reicht dafür nicht Begin und EndUpdate für das ListView?

KodeZwerg 13. Nov 2018 12:41

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
SHGetFileInfo hatte ich vorher, liefert aber nicht immer das zurück was ich möchte. Zwischen den beiden ist kein Nennenswerter Geschwindigkeits-Unterschied.

Ja die IO Zugriffe sind da enorm beansprucht, da falls kein Icon in Datei sein sollte sucht Windows nach dem nächst besten (also mit ExtractAssociatedIcon, die SH-Variante gibt da zu schnell auf und liefert blanko-Template wieder, was nicht unbedingt ein schnelleres Ergebnis bedeutet)

Was ich allerdings im Hinterkopf habe, wenn ich ListView mit ShellListView-Demo vergleiche, bei der Shell-Variante ist ein kompletter Dateipfad schwupps die wupps geladen, sogut wie Verzögerungsfrei. Selbst bei Ordnern mit mehreren Tausend Dateien.

Vielleicht kann ich das ja irgendwie für mich Nutzbar machen, am Ende bleibt es ja eine ListView.

Danke für die Idee es vorher in die ImageList zu laden und beim ListView.Add() nurnoch index dahin setzen, werde ich auf jeden Fall mal ausprobieren, ob es schneller geht, wer weiß :)

Uwe Raabe 13. Nov 2018 12:43

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Probier mal ein
Delphi-Quellcode:
FileIcons.BeginUpdate/EndUpdate
um den Ladevorgang zu legen.

KodeZwerg 13. Nov 2018 12:48

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1417938)
Die Bildschirmausgabe ist nachwievor das Langsamste bei Programmen ;-)

Okay, kann ich probieren, vorm .EndUpdate mal minimieren danach wiederherstellen. Ist ein Versuch Wert!

Zitat:

Zitat von Uwe Raabe (Beitrag 1417941)
Probier mal ein
Delphi-Quellcode:
FileIcons.BeginUpdate/EndUpdate
um den Ladevorgang zu legen.

Boah, wusste noch garnicht das es sowas gibt, das teste ich auch!


Ich melde mich nach Tests wieder.

Dateimenge sind mal 50 mal 500, selten mehr. Aber selbst bei 20-30 Dateien dauert es manchmal 20-30 sekunden. Trotz SSD.

KodeZwerg 13. Nov 2018 12:59

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Bin mit guten Nachrichten zurück, also das FileIcons.Begin/EndUpdate brachte schonmal etwas boost, rein objektiv Betrachtet.
Delphi-Quellcode:
  Application.Minimize;
  lvFiles.Items.EndUpdate;
  FileIcons.EndUpdate;
  Application.Restore;
  Application.BringToFront;
aber das wirkt tatsächlich Wunder, kann ich nur Weiterempfehlen! Besten Dank für Tipps, hab ich aufgesaugt und werde es mir merken!

Ich teste jetzt noch ob das füllen der Icons seperat vom ListView.Add() was bringt.


Beste Grüße!

CCRDude 13. Nov 2018 13:12

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Spontan und komplex:

Ob ein Thread hier hilft, bin ich mir nicht sicher, da es ja um Icon-Handles geht, die im Haupthread stehen müssen.
Aber mindestens die Liste laden und erst danach im OnIdle die Icons stückweise nachladen könnte eine Option sein?

Oder nur die Icons der in der Liste aktuell sichtbaren Einträge laden und die anderen beim Scrollen nachladen?

Ggfls auch Icons cachen, macht die Shell ja auch.

KodeZwerg 13. Nov 2018 13:23

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
@CCRDude, die Idee gefällt mir, sehr sogar!
Also Icon routine komplett aus meiner Füll methode raus, wenn die fertig ist einen Thread starten der dann poe á poe Icons cached und in ListView das Index dafür setzt.
Hab ich ehrlich gesagt noch nie probiert, cooler Gedanke, das werde ich mal separat testen.

Ob mein MainThread momentan hängt kann mir ziemlich egal sein denn ohne ListView kann das Teil nichts :-]


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
Seite 1 von 5  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz