Autor Beitrag
Experience1986
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Fr 03.06.05 17:18 
Hi,

ich versuche mich momentan an einem Musik Player, basierend auf der Bassplayer Bibliothek von UN4Seen. Als Playlist dient mir da eine TLIstView. Diese Komponente wird aber sehr Langsam, sei es bei hinzufügen neuer Daten oder beim auswählen einer Zeile, wenn die Einträge, je nach Rechner Leistung, so etwa die Anzahl 1000 überschreitet.

Bei Winamp kann man aber sehen, das nach 1-2 Sekunden sogar über 5000 Zeilen geladen werden.

Wie kann Winamp das realisieren?

Auch wenn ich die Eigenschaft ViewStyle auf vsList und ListView.Items.BeginUpdate bzw. ListView.Items.EndUpdate bem hinzufügen neuer Daten verwende, komme ich noch lange nicht auf die Performance wie Winamp sie im Bezug auf die TListView an den Tag legt.

Über eine schnelle Antwort würd ich mich sehr freuen.


Moderiert von user profile iconTino: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Di 07.06.2005 um 09:25
sahib
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Sa 04.06.05 19:13 
Hi.

Schaue Dir einmal in der Hilfe unter folgenden Stichworten nach: OwnerData und OnData. Das sollte helfen. Du verwaltest Deine Daten selber.

Christian
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 04.06.05 19:47 
Außerdem empfehle ich einen Blick auf die Komponente "TVirtualListView".
Die VCL ist in der Hinsicht lahm. ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: So 05.06.05 11:47 
user profile iconBenBE hat folgendes geschrieben:
Außerdem empfehle ich einen Blick auf die Komponente "TVirtualListView".
Die VCL ist in der Hinsicht lahm. ;-)

Nur dass sie nicht "TVirtualListView" heißt, sondern "TVirutalTreevie".. ;)
Und falls du mal eine Demonstration in Sachen Geschwindigkeitsvergleich zwischen TListview und TVirtualTreeview willst empfehle ich dir mein Pointer-Tutorial auf www.manuel-poeter.de da ist ein Demo-Projekt in 2-facher Ausführung dabei, einmal mit Listview und einem mit einem VirtualStringTree. Füg bei beiden Versionen mal 10.000 Einträge hinzu und staune!! ;) (für die die sich nicht erst den VirtualTreeview installieren wollen sind die Demos auch als komplette Exe dabei)

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mo 06.06.05 16:32 
Vielen Dank für die antworten...

Wo kann man denn noch etwas über "Non VCL TLIstView" erfahren?

gibt es da seiten die sich speziell mit non VCL beschäftigen...?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 06.06.05 16:50 
www.luckie-online.de - die erste Anlaufstelle für nonVCL. Aber wieso willst du nonVCL arbeiten? Erstens ist nonVCL von haus aus schon wesentlich komplizierter als die VCL und VCL und nonVCL zu mischen kann auch leicht schiefgehen! Warum willst du nicht den VirtualTreeview verwenden?

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Neidhard von Reuental
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: Mo 06.06.05 17:04 
du kannst auch weiter tlistview benutzen. langsam wird es nur weil bei jeder änderung die anzeige aktualisiert wird

um das zu umgehn benutz beginupdate und endupdate
so solte es gehn:
ausblenden Delphi-Quelltext
1:
2:
3:
Listview.Items.BeginUpdate;
// hier die änderungen am listview durchführen
Listview.Items.EndUpdate;


Delphi Hilfe hat folgendes geschrieben:
Die Methode BeginUpdate verhindert die Aktualisierung des TListItem-Objekts, bis die Methode EndUpdate aufgerufen wird.

Delphi-Syntax:

procedure BeginUpdate;

C++ Syntax:

void __fastcall BeginUpdate(void);

Beschreibung

Rufen Sie BeginUpdate auf, bevor Sie mehrere Änderungen an Listeneinträgen durchführen. Aktualisieren Sie die Ansicht nach den Bearbeitungen mit EndUpdate. Mit BeginUpdate und EndUpdate können Sie verhindern, daß die Bildschirmanzeige aktualisiert wird, wenn Einträge angehängt, gelöscht und eingefügt werden.


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 06.06.05 17:31 
Auch mit verwendung von BeginUpdate/EndUpdate ist die VCL-Listview immer noch unglaublich langsam!! Ich verwend bei dem Demo in meinem Pointer-Tutorial auch BeginUpdate/EndUpdate, aber bei der VCL-Listview dauert das Hinzufügen von 10.000 Einträgen ~11sec, beim VirtualTreeview hingegen < 1sec..!!

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 06.06.05 17:48 
Wenn ich die TListView im virtual Mode benutze, dauert das Hinzufügen von 10.000.000 Einträgen ungefähr 0,01 ms (auf einem Celeron) :wink:
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 06.06.05 21:47 
user profile iconNeidhard von Reuental hat folgendes geschrieben:

um das zu umgehn benutz beginupdate und endupdate


hast du gelesen, was Experience geschrieben hat?
wenn nicht, vielleicht das hier:



user profile iconExperience1986 hat folgendes geschrieben:
Hi,

Auch wenn ich die Eigenschaft ViewStyle auf vsList und ListView.Items.BeginUpdate bzw. ListView.Items.EndUpdate bem hinzufügen neuer Daten verwende, komme ich noch lange nicht auf die Performance wie Winamp sie im Bezug auf die TListView an den Tag legt.
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Di 07.06.05 07:13 
Und wie kann ich nun den "virtuellen" Mode einer TListView verwenden?
Erstelle ich einfach die Komponente zur Laufzeit oder muss ich diese von Windows ableiten?

Wenn ja, wie?
(Wie ich Komponenten zur Laufzeit erstelle, weiß ich natürlich.)
sahib
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Di 07.06.05 07:28 
Hi.

Schau Dir bitte noch einmal das zweite posting in diesem Thread an. Da habe ich das schon mal geschrieben. Danach kamen dann solche Dinge: 'wie erlege ich einen Spatzen mit einer Kanone?'

Christian
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 07.06.05 07:33 
@oneOfTen: Doch, habich. Aber was hat 'Begin/EndUpdate' mit dem Virtualmode zu tun?
@sahib: Dein Tip wurde nicht beachtet, weil er nicht vollständig war. :wink: Vielleicht ist es auch zuviel verlangt, bei OnData i ndie Delphi-Hilfe zu schauen.
@Experience1986: ListBox1.Style := lbVirtual. Dann musst Du 'Count' auf die Anzahl der "Items" setzen. Nun wird für jedes darzustellende Item das (wie schon sahib erwähnte) OnData aufgerufen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.06.05 07:40 
Hmm, vielleicht gehts aber auch viel einfacher, bei mir hats schon etwas mehr Speed gegeben, als ich mit myListView.AllocBy die neue Anzahl der Einträge VORHER festgelegt habe. Dann witrd der Speicher nämlich in einem Stück vorher allociert und ist beim Hinzufügen der einzelnen Einträge schon da, sodass er nicht bei jedem Eintrag einzeln für diesen geholt werden muss.
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Di 07.06.05 08:11 
OK...
Aber was muss ich dann beim OnData Event machen?

Werden die Einträge automatisch angezeigt, nachdem ich Count festgelegt habe oder muss ich da noch etwas beachten.
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Di 07.06.05 08:15 
@alzaimar: Mir fällt gerade auf, das du von einer ListBox redest. Ich benötige aber eine ListView.

Die Eigenschaft Style ist bei TListView nicht vorhanden.


================
EDIT:
OK, im zweiten Beitrag steht ich sill OwnerData auf true setzen... Abr was muss ich nun bei OwnerData machen?

Hat jemand ein Beispiel zur Hand?
sahib
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Di 07.06.05 08:21 
Nimm einen Record und eine TList, um diese Daten zu verwalten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  PPlayListEntry = ^TPlayListEntry;
  TPlayListEntry = record
    Titel    : String;
    Interpret: String;
    Dauer    : Word;  // Sekunden
  end;

var
  PlayList: TList;
  OnePlayListEntry: PPlayListEntry;


Dann einfach einen neuen Song zu Deiner Liste zufügen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure AddEntry;
begin
  New(OnePlayListEntry);
  with OnePlayListEntry^ do begin
    Titel := 'On the border';
    Interpret := 'Al Stewart';
    Dauer := 304;
  end;
  PlayList.Add(OnePlayListEntry);
end;


Was fehlt noch, ach ja, das Anzeigen (ListView1.OwnerData := True):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure ListView1Data(Sender: TObject; Item: TListItem);
var
  OnePlayListEntry: PPlayListEntry;
begin
  if (Item.Index >= 0) and (Item.Index <= PlayList.Count) then
  begin
    OnePlayListEntry := PlayList[Item.Index];
    Item.Caption := OnePlayListEntry^.Titel;
    Item.SubItems.Add(OnePlayListEntry^.Interpret);
    Item.SubItems.Add(IntToStr(OnePlayListEntry^.Dauer));
  end
end;

// folgendes hatte ich vergessen
procedure LadePlayList;
begin
  // Daten woher auch immer - einlesen
  // AddEntry für jeden Song
  ListView1.Items.Count := PlayList.Count;
  ListView1.Invalidate;
end;


Viel Spaß damit,
Christian
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 07.06.05 11:21 
@Experience1986: Nicht peitschen, mein Name ist Programm :oops:
@sahib: Na, noch ne Kleinigkeit: :mahn:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure AddEntry;
begin
  New(OnePlayListEntry);
  with OnePlayListEntry^ do begin
    Titel := 'On the border';
    Interpret := 'Al Stewart';
    Dauer := 304;
  end;
  PlayList.Add(OnePlayListEntry);
  ListView1.Count := PlayList.Count;
end;

Das Gleiche noch in 'DelEntry', wenn's sowas gibt.
sahib
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117

Win 2000 SP4+
Delphi 5 Prof.
BeitragVerfasst: Di 07.06.05 11:40 
Naja, das ist ja nun nicht meine Aufgabe gewesen. Ich sollte ja nur zeigen, wie es geht ;) Zum löschen muss man ja auch noch mehr machen (TList.Dispose(x), TList.Delete(x), und natürlich der Aktualisierung in der ListView).

Aber das nehmen wir mal als gegeben hin. Ich könnte natürlich auch soetwas selber schreiben und hier hereinstellen. Das wäre dann wirklich eine nette Hilfe. Eigentlich soll man den Leuten ja nur Hilfe zur Selbsthilfe geben.

Christian
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 07.06.05 11:48 
War ja nicht gegen dich gemünzt, sonder für den Fragensteller.