AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Thema durchsuchen
Ansicht
Themen-Optionen

Kann ich meine ListView beschleunigen (Icon laden dauert ewig)

Ein Thema von KodeZwerg · begonnen am 13. Nov 2018 · letzter Beitrag vom 14. Nov 2018
Antwort Antwort
Schokohase
(Gast)

n/a Beiträge
 
#1

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

  Alt 13. Nov 2018, 17:33
Du kannst da übergeben was du möchtest - der Wert wird im Prinzip nicht wirklich verwendet.
Für Synchronize stimmt das, aber bei Queue spielt es schon eine Rolle.
Könntest du erklären wie oder welche Rolle? Ich sehe aktuell nicht, wo diese Information (Instanz von TThread ) auch beim TThread.Queue sinnvoll verwendet wird.

Auch TThread.Queue ruft intern class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False; ForceQueue: Boolean = False) auf und das habe ich oben erläutert.

Aber bestimmt übersehe ich da etwas ...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 13. Nov 2018, 18:28
Könntest du erklären wie oder welche Rolle? Ich sehe aktuell nicht, wo diese Information (Instanz von TThread ) auch beim TThread.Queue sinnvoll verwendet wird.

Auch TThread.Queue ruft intern class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False; ForceQueue: Boolean = False) auf und das habe ich oben erläutert.
TThread.Destroy ruft TThread.RemoveQueuedEvents auf und dort werden alle noch nicht erledigten Queue-Events für diesen Thread gelöscht und somit nicht mehr ausgeführt. Übergibt man beim Queue ein nil, kommen die Events auch noch an wenn der auslösende Thread schon weg ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

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

  Alt 13. Nov 2018, 18:48
TThread.Destroy ruft TThread.RemoveQueuedEvents auf
jetzt wo du es sagst ... stimmt, da war noch was
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 13. Nov 2018, 22:29
Das mit dem TParallel.For() bekomme ich auch nicht wirklich in Gange.
Zum verzweifeln wenn man nicht weiß wie.
Delphi-Quellcode:
procedure TfrmMain.StartIcons3( AListView: TListView; AImageList: TImageList );
var
  LIcon: TIcon;
  dummy: Word;
begin
  dummy := 0;
  LIcon := TIcon.Create;
  LIcon.Transparent := True;
  TParallel.For(0, AListView.Items.Count - 1,
    procedure(Index: Integer; State: TParallel.TLoopState)
    var
      Filename : string;
    begin
      try
        if State.ShouldExit then Exit;
        TThread.Synchronize(nil,
          procedure
          begin
            Filename := AListView.Items.Item[ Index ].Caption;
            LIcon.Handle := ExtractAssociatedIcon( hInstance, PWideChar( Filename ), dummy );
            LIcon.Transparent := True;
            AListView.Items.Item[Index].ImageIndex := AImageList.AddIcon( LIcon );
            DestroyIcon( LIcon.Handle );
          end);
      finally
      end;
    end);
  LIcon.Free;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

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

  Alt 13. Nov 2018, 22:51
Zitat:
Übergibt man beim Queue ein nil, kommen die Events auch noch an wenn der auslösende Thread schon weg ist.
Ok hilft dir jetzt nicht weiter möchte aber doch noch darauf antworten.

@Uwe Raabe
Du bist Profi ohne frage
Aber das Phänomen konnte ich bisher in realer Anwendungsumgebung bisher so nicht ausmachen.
Wenn der Thread bei mir geschlossen wird dann ist da nix mehr mit Events auch bei Queue nicht.

Wie bei meinem Mixer.. also wie soll dann der System Mixer Events an meinen Thread schicken können wenn er weg ist.
Nun er kann es versuchen, hat aber keine Auswirkung da sie nicht verarbeitet werden können bzw. kommen nicht mehr an.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 13. Nov 2018, 23:32
Aber das Phänomen konnte ich bisher in realer Anwendungsumgebung bisher so nicht ausmachen.
Wenn der Thread bei mir geschlossen wird dann ist da nix mehr mit Events auch bei Queue nicht.

Wie bei meinem Mixer.. also wie soll dann der System Mixer Events an meinen Thread schicken können wenn er weg ist.
Nun er kann es versuchen, hat aber keine Auswirkung da sie nicht verarbeitet werden können bzw. kommen nicht mehr an.
Der Begriff "Event" ist hier nicht im Sinne der Windows-API oder eines Delphi-Methodenzeigers zu verstehen, sondern im wörtlichen Sinne als Ereignis, das von einem Queue-Aufruf im Thread ausgelöst und im Hauptthread abgearbeitet wird.

Wenn du innerhalb eines Threads einen Queue-Aufruf machst, dann wird der erstmal in die Warteschlange gelegt, bis der Hauptthread ihn abarbeitet. Im Gegensatz zu Synchronize arbeitet der Thread aber sofort weiter und kann sich natürlich auch beenden. Sollte das passieren bevor die Warteschlange vollständig abgearbeitet wurde, dann entfernt das TThread.Destroy noch eben schnell alle Queue-Calls aus der Warteschlange, die noch einen Verweis auf den besagten Thread haben.

Es handelt sich natürlich um eine Race Condition, was ein konkretes Beispiel schwer macht. Das Phänomen kann man aber häufig mit dem anhängenden (sinnfreien) Beispiel provozieren. Je nachdem welchen der beiden Queue-Aufrufe man verwendet kommt entweder nur ein Teil oder alle Zahlen im Memo an.
Angehängte Dateien
Dateityp: zip Projekt443.zip (1,3 KB, 6x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

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

  Alt 13. Nov 2018, 23:39
Zitat:
sondern im wörtlichen Sinne als Ereignis
Ja nun es sind diese die mir vom System Mixer geschickt werden.
Diese Events nehme ich an und schicke sie zum Mainthread mehr ist da nicht.

Vielleicht verstehe ich dich auch nicht so recht was genau gemeint ist.
Es geht nicht um Threads von meiner Anwendung zu meiner DLL und umgekehrt sondern um Threads vom System zur Anwendung.

Und da kann ich solche Probleme nicht feststellen.

Zitat:
dann wird der erstmal in die Warteschlange gelegt, bis der Hauptthread ihn abarbeitet
Jo nichts anderes als PostMessage im weitläufigen sinne.
Na ja auf jeden fall.. Danke für die Infos.

gruss

Geändert von EWeiss (13. Nov 2018 um 23:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz