AGB  ·  Datenschutz  ·  Impressum  







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

Directory und Files auflisten

Ein Thema von Smiley · begonnen am 12. Aug 2019 · letzter Beitrag vom 17. Aug 2019
Antwort Antwort
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#1

AW: Directory und Files auflisten

  Alt 16. Aug 2019, 16:34
Ich habe jetzt mal ausprobiert was es ausmacht mit 4 Threads zu arbeiten.
Habe die Omnithread Lib benutzt und damit mein großes Verzeichnis eingelesen.
14019 Verzeichnisse 48488 Dateien

Mit OmniThread Zeit: 01:46:370
Ohne Threads Zeit: 01:56:908

Der Unterschied ist also kaum spürbar, zumindest wenn die Suche über ein Netzwerklaufwerk läuft.
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#2

AW: Directory und Files auflisten

  Alt 16. Aug 2019, 16:39
Eine andere Sache ist hierbei aufgetreten.
Möglicherweise hat dazu jemand eine Idee.

Wenn ich in mein Programm ein Application.ProcessMessages einbaue, hängt das Programm an dieser Stelle und muss mit dem Taskmanager beendet werden.

Hier das Programm dazu:

Delphi-Quellcode:
// **************************************************************************
procedure TForm1.btnStartClick(Sender: TObject);
var
  // SearchResult
  MainVerz: TStringDynArray;
  SearchResult: TStringDynArray;
  StartTime, FirstTime: TTime;
  I: Integer;

begin
  for I := 0 to 10 do
    TaskStatus[I] := False;

  Grid.RowCount := 1000; // High(SearchResult);
  Grid.FixedCols := 1;
  Grid.ColCount := 3;
  Grid.StartUpdate;
  AktLine := 1;

  // Uses IOUtils für GetDir..und System.Types für DynArray hinzufügen
  // Alle Hauptverzeichnisse einlesen und dann pro Verz. eine Suche ausführen in eigenem Thrad
  StartTime := Now();
  FirstTime := Now;
  MainVerz := TDirectory.GetDirectories('Y:\eBooks\eLoad24', TSearchOption.soTopDirectoryOnly, nil);

  for j := 0 to High(MainVerz) do
    begin
      ListBox1.Items.Add(MainVerz[j]);
      try
        Begin
          // Einlesen der Dateien ab dem Verz[j]
          SearchResult := TDirectory.GetFiles(MainVerz[j], '*.pdf', TSearchOption.soAllDirectories);
          for I := Low(SearchResult) to High(SearchResult) do
            begin
              if SearchResult[I] <> 'then
                begin
                  Grid.Cells[1, AktLine] := ExtractFilename(SearchResult[I]);
                  Grid.Cells[2, AktLine] := ExtractFilePath(SearchResult[I]);
                  inc(AktLine);
                end;
            end;
          TaskStatus[j] := True;
          ListBox1.Items.Add('Task ' + IntToStr(j) + ' Zeit: ' + FormatDateTime('hh:nn:ss:zzz', Now - StartTime));
          StartTime := Now();
          // Application.ProcessMessages;
        End;
      except
        { Catch the possible exceptions }
        MessageDlg('Incorrect path or search mask', mtError, [mbOK], 0);
        Exit;
      end;
      // Application.ProcessMessages;

    end;

  ListBox1.Items.Add('--------------------------------------------');
  ListBox1.Items.Add('Gesamt Zeit: ' + FormatDateTime('hh:nn:ss:zzz', Now - FirstTime));

  Grid.RowCount := AktLine;
  Grid.AutoSizeCol(1);
  Grid.AutoSizeCol(2);
  Grid.SortSettings.IgnoreCase := True;
  Grid.Sort(1, sdAscending);
  Grid.SortSettings.Show := True;
  Grid.EndUpdate;
end;
// **************************************************************************
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
383 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Directory und Files auflisten

  Alt 16. Aug 2019, 18:37
Wozu ist der Taskstatus? Den zählst Du fix von 0-10.
Aber weiter unten in:

Delphi-Quellcode:
 for j := 0 to High(MainVerz) do
    begin
....
TaskStatus[j] := True;
Davon ganz abgesehen brauchst Du bestimmt nicht soundsoviel tausend Processmessages... Es reicht, immer mal zwischendurch und nicht bei jeder Datei ein Processmessages zu benutzen. Vielleicht ein zusätzlicher Zähler, der alle 50 oder 100 Dateien ausgelöst wird.
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#4

AW: Directory und Files auflisten

  Alt 16. Aug 2019, 19:31
Der TaskStatus ist noch ein Überbleibsel als ich versucht habe mit 2 Tasks bzw. Threads zu arbeiten.
Den ProcessMessages habe ich nur nach jedem Verzeichnis gemacht, damit in der Listbox das Verzeichnis, in dem ich mich gerade befinde, angezeigt wird.
Selbst wenn ich nur ein einziges mal das PrcessMessages aufrufe hängt das Programm schon.
Ist wohl erst seit Windows 10 so, wie ich woanders schon gelesen habe.
Das wäre dann mal ein Grund doch mit Threads zu arbeiten.
Doch die Listbox und das Grid sind nur zum testen, eigentlich sollen die Daten ja in eine Datenbank geschrieben werden.
Da ist dann lediglich das Problem, dass vom Programm dann mal für einige Zeit "Keine Rückmeldung" angezeigt wird.
Habe dann mal versucht Listbox.Refresh aufzurufen in der Schleife, das geht solange gut, bis ein großes Verzewichnis kommt, dann kommt wieder "Keine Rückmeldung".
Wenn alle Verzeichnisse abgearbeitet sind ist alles wieder gut.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Directory und Files auflisten

  Alt 17. Aug 2019, 11:39
Da ist dann lediglich das Problem, dass vom Programm dann mal für einige Zeit "Keine Rückmeldung" angezeigt wird.
Habe dann mal versucht Listbox.Refresh aufzurufen in der Schleife, das geht solange gut, bis ein großes Verzewichnis kommt, dann kommt wieder "Keine Rückmeldung".
Wenn alle Verzeichnisse abgearbeitet sind ist alles wieder gut.
Das ist auch vollkommen normal und richtig. Solange Dein Programm (Mainthread) damit beschäftigt ist die Informationen aus einem Verzeichnis zu holen, schert es sich nicht um die Oberfläche. Oder besser es kann nur eine Sache auf einmal erledigen, da es auch nur einen Thread gibt. Wenn Du mit zwei Threads arbeitest dann kann der Ausleser bei Gelegenheit die Gui informieren wie weit er ist, und die GUI zeigt das dann bei der nächsten Gelegenheit an. Nur wenn über einen längeren Zeitraum keine neue Information gesendet wird, gibt es auch nichts neues zum Anzeigen. Nur das "keine Rückmeldung" taucht nicht auf, da die Gui ja noch arbeitsfähig ist.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 23:04 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