Um mein GUI nicht unnötig zu blockieren, möchte ich das rekursive Auslesen einer Verzeichnisstruktur in einen Thread auslagern. Die Thread-Methode Execute ruft folgende Methode SearchFiles auf.
Code: Alles auswählen
procedure TMySearchThread.SearchFiles(aRoot: String);
var
search: TSearchRec;
begin
if FindFirstUTF8(aRoot+'*',faDirectory,search) = 0 then
try
repeat
if (search.Attr and faDirectory) = faDirectory then
SearchFiles(IncludeTrailingPathDelimiter(aRoot+search.Name))
else
begin
// sync with main thread
FFile := aRoot+search.Name;
// call event handler
Synchronize(@MTSyncProc);
end;
until Terminated or (FindNextUTF8(search) <> 0);
finally
FindCloseUTF8(search);
end;
end;Die Synchronisation zwischen diesem und dem Main-Thread ist bisher noch nicht vollständig implementiert (d.h. nicht überprüfbar).
Eine solche Rekursion habe ich auch bereits an anderer Stelle gefunden, auch wenn nicht auf Threads bezogen. Die Variante mit neuen Threads möchte ich eher ungern verwenden, auch wenn die Anzahl an Verzeichnissen und Dateien in der Regel sehr begrenzt ist (ca. 5 Verzeichnisse mit jeweils 3 Ebenen). Ich kann mir nur schlecht vorstellen, dass hier bisher noch niemand so etwas versucht hat. Gibt es also eine Möglichkeit die Rekursion auf einen Thread zu beschränken?