Delphi-PRAXiS
Seite 2 von 5     12 34     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)

Hobbycoder 13. Nov 2018 13:03

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Hm...würde mir einer mal erklären, warum BeginUpdate und EndUpdate einer ListView nicht ausreichen, und zusätzlich noch das Minimize btw. Restore mehr Geschwindigkeit bringen soll?

DieDolly 13. Nov 2018 13:09

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

wenn die fertig ist einen Thread starten der dann poe á poe Icons cached und in ListView das Index dafür setzt.
Warum so kompliziert und nicht einfach die Icons in eine ImageList stecken. Meinet wegen sogar in einem Thread. Aber das ge-cache bringt mal gar nix verglichen zu einer ImageList.
Zitat:

und zusätzlich noch das Minimize btw. Restore mehr Geschwindigkeit bringen soll?
Ich stelle mir gerade ein Programm vor, das sich einfach während der Nutzung mal minimiert und wieder maximiert. Sähe sehr vertrauenswürdig aus :D

Delphi.Narium 13. Nov 2018 13:28

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

Zitat von Hobbycoder (Beitrag 1417947)
Hm...würde mir einer mal erklären, warum BeginUpdate und EndUpdate einer ListView nicht ausreichen, und zusätzlich noch das Minimize btw. Restore mehr Geschwindigkeit bringen soll?

Weil dann jegliche Aktuallisierung des Bildschirmes / der Anzeige wegfällt. Und das dauert unter Windows halt.

Ist 'ne langjährige praktische Erfahrung / Beobachtung, die man halt ausnützen kann, wenn was schneller gehen soll.

Und ja @DieDolly, anwenderfreundlich ist was anderes ;-)

KodeZwerg 13. Nov 2018 13:46

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Delphi-Quellcode:
procedure TfrmMain.StartIcons();
begin
  TThread.CreateAnonymousThread(procedure ()
    var
      LIcon: TIcon;
      I: Integer;
      dummy: Word;
    begin
      dummy := 0;
      LIcon := TIcon.Create;
      LIcon.Transparent := True;
      try
        lvFiles.Update;
        FileIcons.BeginUpdate;
        for i := 0 to lvFiles.Items.Count -1 do
          begin
            LIcon.Handle := ExtractAssociatedIcon( hInstance, PWideChar( lvFiles.Items.Item[ i ].Caption ), dummy );
            LIcon.Transparent := True;
            lvFiles.Items.Item[ i ].ImageIndex := FileIcons.AddIcon( LIcon );
            DestroyIcon( LIcon.Handle );
          end;
        TThread.Synchronize (TThread.CurrentThread, procedure ()
          begin
          end);
      finally
        FileIcons.EndUpdate;
        LIcon.Free;
      end;
    end).Start;
end;
Ich habe die Idee mit Thread mal auf diese Weise ausprobiert, also Geschwindigkeit boost ohne ende, aber irgendwas mach ich da noch falsch, jetzt werden viele Icons nicht korrekt geladen.

DeddyH 13. Nov 2018 13:50

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Niemals unsynchronisiert aus einem Thread heraus auf VCL-Controls zugreifen, das ist eine uralte Weisheit.

EWeiss 13. Nov 2018 13:55

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

TThread.Synchronize (TThread.CurrentThread, procedure ()
begin
end);
Nun ja man muss da schon etwas zwischen pappen und zwar die Funktion die vom Mainthread verwendet wird um die Icons zu Zeichen.
Im Moment macht Synchronize gar nichts.

Und dann kannst du auch nicht sicher sein ob Synchronize das richtige ist denke mal nicht denn du möchtest ja nicht warten oder?
Denn dann dauert es wieder genauso lang.
Spiele mal mit Queue und Synchronize rum dann nimm das was am besten für dich ist.

gruss

Daniel 13. Nov 2018 13:56

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
Wo kommt denn der Geschwindigkeitsvorteil her?
Vorher wurde alles im Mainthread gemacht, jetzt alles in einem einzigen Thread. Die Arbeit wurde 1:1 verlagert. Einen Vorteil hast Du doch erst, wenn Du mehrere Threads auf das Problem loslässt und somit mehrere Kerne nutzt. :gruebel:

KodeZwerg 13. Nov 2018 13:56

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

Zitat von DeddyH (Beitrag 1417953)
Niemals unsynchronisiert aus einem Thread heraus auf VCL-Controls zugreifen, das ist eine uralte Weisheit.

Delphi-Quellcode:
procedure TfrmMain.StartIcons();
begin
  TThread.CreateAnonymousThread(procedure ()
    var
      LIcon: TIcon;
      I: Integer;
      dummy: Word;
    begin
      dummy := 0;
      LIcon := TIcon.Create;
      LIcon.Transparent := True;
      try
        lvFiles.Update;
        FileIcons.BeginUpdate;
        for i := 0 to lvFiles.Items.Count -1 do
        begin
          begin
            LIcon.Handle := ExtractAssociatedIcon( hInstance, PWideChar( lvFiles.Items.Item[ i ].Caption ), dummy );
            LIcon.Transparent := True;
          end;
        TThread.Synchronize (TThread.CurrentThread, procedure ()
          begin
            lvFiles.Items.Item[ i ].ImageIndex := FileIcons.AddIcon( LIcon );
          end);
        DestroyIcon( LIcon.Handle );
        end;
      finally
        FileIcons.EndUpdate;
        LIcon.Free;
      end;
    end).Start;
end;
Danke, ich habe es auf diese Weise korrigiert aber das Problem besteht immer noch, ich finde meinen Fehler nicht.

Delphi.Narium 13. Nov 2018 14:00

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
 
DeddyHs Hinweis auf alle VCL-Controls anwenden und nicht nur auf eine Zeile? ;-)

EWeiss 13. Nov 2018 14:01

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

Danke, ich habe es auf diese Weise korrigiert aber das Problem besteht immer noch, ich finde meinen Fehler nicht.
Lies noch mal meinen Beitrag..
Du verwendest SendMessage besser wäre PostMessage wenn du nicht warten willst.

Zitat:

DeddyHs Hinweis auf alle VCL-Controls anwenden und nicht nur auf eine Zeile?
Richtig der ganze kram mit dem Icon erstellen usw.. muss da rein.
Du kannst TThread wie eine normale procedure behandeln falls du das nicht weist.

Delphi-Quellcode:
TThread.Synchronize (TThread.CurrentThread,
procedure ()
var
// Meine Variablen
begin
// Meine Funktion
end);
gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 Uhr.
Seite 2 von 5     12 34     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