Einzelnen Beitrag anzeigen

Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#18

Re: Luckie's DriveTools in einen Thread auslagern

  Alt 31. Dez 2009, 06:40
Zitat von Guido Eisenbeis:
... Denn ich tue mir im Moment ein wenig schwer damit, was wo in welchem Thread abgerufen wird, bzw. ankommt.
Hier kam ein Fehler hinzu, den ich finden konnte: Aus mir noch nicht ersichtlichem Grund hat sich in der Projekt-Datei der Eintrag "Application.CreateForm(TForm1, Form1);" 2x befunden!?

Zitat von Daniel G:
Der Code basiert im Endeffekt auf dem CodeLib-Eintrag von SirThornberry.
Habe ich bei meiner Recherche hier im Forum schon mitbekommen.

Zitat von Daniel G:
...
Eigentlich brauchst du als externe Abhängigkeit nur die Like-Funktion.

Der relevante Teil, der den Code nutzt, findet sich hier:

[delphi]procedure TMediaClass.AddFolderToDatabase(FolderPath: String);
...
Auch das konnte ich schon herrauskristallisieren. Dennoch vielen Dank! (Manchmal hat man einen Hänger ... )


Zitat von himitsu:
...
Flott? (hab das grad mal auf meine Datenplatte losgelassen)

Dort wird doppelt gesucht
- einmal zur initialisierung, worüber das Ende der ProgressBar bestimmt wird
- und dann NOCHMAL für's Suchen
Die Initialisierung hat ja nichts mit der eigentlichen Suche zu tun. Wie "Rüdiger Hoffmann" schon mal sagt: "Das kann man machen, ... muss man aber nicht!" (Später unten mehr.)


Zitat von himitsu:
außerdem wird jede Datei in diesem Label angezeigt, was enorm ausbremst
Mecker, mecker, mecker! Das gleiche wie oben: Auch diese Funktion ist optional. Man kann sie in diesem Code verwenden, wie in jedem anderen. Dort wird sie genauso bremsen!


Zitat von himitsu:
Gerade daß man doppelt suchen muß, ist bei dieser Art des Fortschritts ein Problem.
Ich finde die Initialisierung genial! Wer eine bessere Art weiß, die Grundlage für einen Progress zu erstellen, hat meine Aufmerksamkeit.


Zitat von himitsu:
http://www.delphipraxis.net/internal_redirect.php?t=167783&highlight=findallfi les
Dort kann man sich über den Callback anzeigen lassen, wo die Suche sich gerade befindet,
Auch das geht mit Luckys Code.


Zitat von himitsu:
worüber sich dann der User in etwa ausdenken kann, wie lange es eventuell noch dauert
(darüber muß man sich zwar in etwa über seine Ordnerstrucktur im klaren sein, aber wer weiß denn nicht, was er auf seinem Rechner hat )
Hi, hi, hi, hi, *nett-gemeintes-Lachen* ... Du willst wirklich, dass der User sich ausdenkt, wie lange es noch dauert!? Das ist ja noch besser als die Windows-Progress-Anzeigen, die von 4 Stunden auf 2 Minuten springen! *nett-gemeint*


Zitat von himitsu:
Werd ich mir ansehen.


Zitat von himitsu:
Zitat von Luckie:
Aber so weit ich mich erinnere, ist das optional.
Nja, hatte ich bei 'nem eigenem Projekt auch mal so gemacht, weil ich dachte das wäre besser/schöner.
Sobald ich mal Zeit habe dieses zu ändern, wird es bei mir wieder ausgebaut, da es einfach nur nervt, wenn knapp 1,5 Minuten lang eine Initialisierung läuft.
Zum einen ist es optional, zum anderen wirst du um die Initialisierung nicht drum rum kommen. Wenn du direkt mit der Suche beginnst, dauert die auch so lange, beim ersten Durchgang. (Sieh weiter unten.)


Zitat von himitsu:
OK, hatte es dann so gemacht, daß nach 'ner halben Minute die Suche paralell mitläuft (dann braucht die initialisierung "nur" etwa 2 Minuen, aber insgesamt geht es schon schneller)
Das wage ich mal zu bezweifen. Denn wie gesagt, die Initialisierung findet statt, auch wenn du sie nicht so nennst. Wenn du zwei Such-Vorgänge parallel laufen lässt, (und die Initialisierung in Luckys Code ist einer,) auf der gleichen physikalischen Platte, dann wird deine Gesamt-Suche *nicht* schneller!


Zitat von himitsu:
In einem Testprojekt läuft es jetzt ohne vorherige Suche/Initialisierung und mit 'ner passend optimierteren Dateiliste/Dateiverwaltung und das insgesamt weit über 30% schneller.
Lass uns doch bitte an deinem Code teilhaben.


Zitat von himitsu:
Gut, wenn genügend RAM frei ist, dann läuft der zweite Suchdurchlauf schneller, da dann noch alle Verzeichnisse in der WFC rumliegen.
WFC? MFC? VCL?


Zitat von himitsu:
Wobei ich vielleicht erwähnen sollte, daß es sich hier um Laufwerke mit Datei-/Verzeichnisanzahlen im 5- bis 6-stelligen Bereich handelt, wo das doppelte Suchen schon sehr auffällt.
(mit viel Zeit im Rücken würde ich das Ganze dann auch gerne mal auf ein direktes Auslesen der MFT umstellen)
Das mit der MFT wäre vielleicht interessant!?


Ok, hier ist das "Weiter unten".

Ich versuche meine Ansichten mal möglichst auf einen kurzen Nenner zu bringen:

1. Bei der Suche kann man rekursiv oder iterativ vorgehen. Was welche Vorteile hat, sei hier mal dahingestellt.

2. Nach Windows 98 werden die Tabellen, die bei einer von uns gemeinten Suche beim ersten Durchlauf gemacht werden, vom Betriebssystem gecacht. (Ob das bei Win 2000 so ist, nehme ich an, bei XP definitiv.)

3.Es spiel keine Rolle, ob man den ersten Durchlauf nun zum Initialisieren benutzt, um bei der ausführlichen Suche einen Progress anzuzeigen, oder direkt für eine Suche. Der erste Duchgang dauert halt länger.

Das sind jetzt keine empierische Erkenntnisse, sondern einfach meine Ansicht. Die wird durch einen Test untermauert, von dem sich im Anhang ein Screenshot der Ergebnisse befindet. Edit: Die Ergebnisse sind gerundet.

Der Test wurde nach eine Windows-Neustart durchgeführt. Nach dem ein Bereich (in diesem Fall ein Laufwerk) durchsucht wurde, dauert jede weitere Suche (insbesondere Initialisierung) nur ein Bruchteil der ersten Suche. Das bleibt so, bis zum nächsten Windows-Neustart.

Guido.


PS: Off-Topic: Guten Rutsch!


Edit: Hinweis für gerundete Ergebnisse.
Miniaturansicht angehängter Grafiken
test_zeitdauer_bei_dateisuche_746.png  
  Mit Zitat antworten Zitat