AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

schnellere Procedure gesucht

Ein Thema von bluescreen25 · begonnen am 19. Dez 2005 · letzter Beitrag vom 21. Dez 2005
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: schnellere Procedure gesucht

  Alt 20. Dez 2005, 11:27
Zitat von xaromz:
Rekursiv abgespeichert wird auf einer Platte erst mal gar nichts.
Doch: Genau das wird es, wie Du im weiteren Verlauf Deiner Erklärung erläuterst. Wobei der Terminus "rekursiv Abspeichern" natürlich nicht so stimmt, weil es das gar nicht gibt, aber die Datenstruktur ist eben rekursiv definiert:
"Ein Verzeichnis ist eine Liste von Dateien oder Verzeichnissen"
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#12

Re: schnellere Procedure gesucht

  Alt 20. Dez 2005, 11:31
Hallo,
Zitat von alzaimar:
Zitat von xaromz:
Rekursiv abgespeichert wird auf einer Platte erst mal gar nichts.
Doch: Genau das wird es, wie Du im weiteren Verlauf Deiner Erklärung erläuterst. Wobei der Terminus "rekursiv Abspeichern" natürlich nicht so stimmt, weil es das gar nicht gibt, aber die Datenstruktur ist eben rekursiv definiert:
"Ein Verzeichnis ist eine Liste von Dateien oder Verzeichnissen"
Es wird nichts rekursiv abgespeichert, sondern eben in einem Baum (so ist die Struktur nämlich definiert). Dass Rekursion ein probates Mittel ist, um Bäume zu durchlaufen, hat damit nicht das Geringste zu tun .

Gruß
xaromz
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: schnellere Procedure gesucht

  Alt 20. Dez 2005, 11:33
Sag ich doch.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: schnellere Procedure gesucht

  Alt 20. Dez 2005, 11:48
DoSearch(ExtractFilePath(Path) + '\'); Das ist natürlich Schwachsinn und falsch. Alzaimar hat natürlich recht das das Backslash weg muss.

Gruß Hagen
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: schnellere Procedure gesucht

  Alt 20. Dez 2005, 15:51
Zitat von negaH:
[delphi]
2.) List == mediaplayer_frm.PlayList_ListBox.Items wird mit .BeginUpdate/.EndUpdate gelockt und somit nicht ständig neu gezeichnet. Die TStrings dieser VCL Objekte wie TListBox, TMemo, TComboBox sind nur Handler um direkt auf das Windows Fenster Handle mit seiner internen Liste zuzugreifen. Das dauert alles sehr sehr lange und ist ineffizient.
noch mal eine Frage, wenn ich aber jetzt meine Playlist (TStringlist) mit List fülle, dann habe ich die Pfade dort drinstehen wo ich diese haben möchte für den Verlauf meines Programms.

Meine PlayList_Listbox soll daher parallel nur die Dateinamen erhalten. Nur wo und wie greife ich die hier am besten ab, ohne wieder alles zu verlangsamen ?

und wieso durchsucht der erst den gewünschten Ordner inkl Ordnerstruktur darunter und danach auch die Struktur darüber ???
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: schnellere Procedure gesucht

  Alt 20. Dez 2005, 16:04
Zitat:
2.) List == mediaplayer_frm.PlayList_ListBox.Items wird mit .BeginUpdate/.EndUpdate gelockt und somit nicht ständig neu gezeichnet. Die TStrings dieser VCL Objekte wie TListBox, TMemo, TComboBox sind nur Handler um direkt auf das Windows Fenster Handle mit seiner internen Liste zuzugreifen. Das dauert alles sehr sehr lange und ist ineffizient.
noch mal eine Frage, wenn ich aber jetzt meine Playlist (TStringlist) mit List fülle, dann habe ich die Pfade dort drinstehen wo ich diese haben möchte für den Verlauf meines Programms.

Meine PlayList_Listbox soll daher parallel nur die Dateinamen erhalten. Nur wo und wie greife ich die hier am besten ab, ohne wieder alles zu verlangsamen ?

und wieso durchsucht der die Ordnerstruktur die ich auswähle (incl. Unterordner) und dann noch diejenige, die darüber liegt (eine Ebene höher) ???


Aufruf: (ist i.O. da mit alter Procedure schon gelaufen, habe unten Textdateien ausgelagert zum prüfen.

Delphi-Quellcode:
procedure Tmediaarchiv_frm.Dir_to_PlayList;
var Ext: TStringList;
    dir: string;
 begin
   ext := TStringList.Create;
   dir := mediaplayer_frm.spSkinSelectDirectoryDialog1.Directory;
   //ext.Sorted := false;
   Flag_File_search_stop := false;
    begin
     try
      if config_frm.File_Mask_check_mp3.Checked = true then
      ext.Add('.' + config_frm.File_Mask_check_mp3.Caption);
      if config_frm.File_Mask_check_wav.Checked = true then
      ext.Add('.' + config_frm.File_Mask_check_wav.Caption);

      AllFilesWithExtension(dir,Playlist,ext);
       
     finally
     ext.SaveToFile('d:\ext.txt');
     playlist.SaveToFile('d:\playlist.txt');
     ext.Free;
     end;
   end;

Etwas angepasst, fehlten ein paar end; Mir scheint als liegt der Fehler unten beim ListUpdate, bin aber noch nicht fit genug um das zu korregieren. Es sieht so aus, als würde der Path innerhalb der Schleife umgeschrieben.... kann das ?

Delphi-Quellcode:
procedure Tmediaarchiv_frm.AllFilesWithExtension(const Path: String; List, Extension: TStrings);
var
  Tick: Cardinal;

  procedure DoSearch(const Path: String);
  var
    SR: TSearchRec;
  begin
    if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if GetTickCount >= Tick then
        begin
          Tick := GetTickCount + 100;
          Application.ProcessMessages;
        end;

        if (SR.Attr and faDirectory <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then
          DoSearch(Path + SR.Name + '\')
        else
          if Extension.IndexOf(ExtractFileExt(SR.Name)) >= 0 then
            List.Add(Path + SR.Name);

      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
 end;

 begin
  List.BeginUpdate;
  try
    Tick := GetTickCount + 100;
    DoSearch(ExtractFilePath(Path));
    mediaplayer_frm.PlayList_ListBox.Items.Addstrings(Playlist);
  finally
    List.EndUpdate;
  end;
end;

Grüße bluescreen25
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#17

Re: schnellere Procedure gesucht

  Alt 21. Dez 2005, 19:18
Hallo bluescreen25,

ich hoffe ich habe deinen Hilferuf richtig verstanden. Hier eine Demo, die meine beiden Codes verbindet. Die Dateien werden in einer virtuellen ListBox ohne Pfadinfo angezeigt, aber mit Pfad gespeichert. Die Reaktion auf Anwendungsereignisse habe ich aus der Schleife heraus genommen und der Pfad wird als Konstante schon mit trailing path delimiter übergeben.

Mit dem fine tuning deiner Anwendung würde ich warten, bis sie fertig ist - und ich denke du hast da noch einiges zu erledigen. Eine wirkliche Beschleunigung erfährt ein media harvester nur durch eine informierte Auswahl der zu durchsuchenden Verzeichnisse. Alles zu durchsuchen ist ein brute force Ansatz, der eigentlich nicht nötig ist. In der Demo habe ich eine FolderBox eingebaut, die per Kontextmenü mit Verzeichnissen befüllt werden muss. Erst dann kann gesucht werden.

Es sind noch ein paar Details versteckt, aber die Zeit zum Ausarbeiten fehlt mir momentan. Vielleicht hilft es dir ja trotzdem ein Stück auf deinem eigenen Weg.

Grüße vom marabu
Angehängte Dateien
Dateityp: zip playlist_110.zip (3,1 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: schnellere Procedure gesucht

  Alt 21. Dez 2005, 19:40
Zitat von marabu:
Hallo bluescreen25,

ich hoffe ich habe deinen Hilferuf richtig verstanden. Hier eine Demo, die meine beiden Codes verbindet. Die Dateien werden in einer virtuellen ListBox ohne Pfadinfo angezeigt, aber mit Pfad gespeichert. Die Reaktion auf Anwendungsereignisse habe ich aus der Schleife heraus genommen und der Pfad wird als Konstante schon mit trailing path delimiter übergeben.

Mit dem fine tuning deiner Anwendung würde ich warten, bis sie fertig ist - und ich denke du hast da noch einiges zu erledigen. Eine wirkliche Beschleunigung erfährt ein media harvester nur durch eine informierte Auswahl der zu durchsuchenden Verzeichnisse. Alles zu durchsuchen ist ein brute force Ansatz, der eigentlich nicht nötig ist. In der Demo habe ich eine FolderBox eingebaut, die per Kontextmenü mit Verzeichnissen befüllt werden muss. Erst dann kann gesucht werden.

Es sind noch ein paar Details versteckt, aber die Zeit zum Ausarbeiten fehlt mir momentan. Vielleicht hilft es dir ja trotzdem ein Stück auf deinem eigenen Weg.

Grüße vom marabu
Hallo marabu, erstmal vielen Dank für deine Hilfe (weiss das zu schätzen). Deine Procedure hatte ich soweit integriert und auch das Prob mit den Pfaden hatte ich im Griff, obwohl ich ListBox.Style = lbVirtual noch nicht einmal so richtig prüfen konnte (hatte einen anderen Weg eingeschlagen).

Jetzt ist auf einmal die Diskussion hier entbrannt, um die schnellste procedure zu integrieren.
Da ich eh gerade dabei war zu probieren, ist mir aufgefallen, das die procedure von negaH nochmals spürbar schneller war, obwohl zur Zeit der Code irgendwie nicht ganz korrekt arbeitet.

Ich übergebe da einen Path und er durchsucht diesen inkl. Unterordner rasend schnell aber dann durchsucht er auch eine Path-Stuktur darüber. Da finde ich im Code von negaH leider den Fehler nicht.


Deine procedure läuft soweit perfekt .

Nochmals vielen Dank für deine Mühe und Geduld....
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#19

Re: schnellere Procedure gesucht

  Alt 21. Dez 2005, 20:47
Zitat von bluescreen25:
Ich übergebe da einen Path und er durchsucht diesen inkl. Unterordner rasend schnell aber dann durchsucht er auch eine Path-Stuktur darüber.
Deine Beobachtung ist nicht ganz richtig. Hagen durchsucht zuerst den übergeordneten Pfad und dann dessen untergeordnete Verzeichnisse. Ändere einfach den Aufruf:

Delphi-Quellcode:
// DoSearch(ExtractFilePath(Path));
DoSearch(IncludeTrailingPathDelimiter(Path));
Gute Nacht.

marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 14:20 Uhr.
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