Synchronize() und rekursive Funktion
-
Hallo Kollegen,
ich habe ein Programm geschrieben, das ein Verzeichnis ausliest. Wenn das ein Unterverzeichnis entdeckt wird, wird die Funktion, die das Verzeichnis ausliest, erneut aufgerufen (rekursiv):
void __fastcall TReadDirTree::ScanDir(AnsiString Verzeichnispfad) { //Verzeichnis auslesen //ein unterverzeichnis gefunden ScanDir(Unterverzeichnispfad); }Das hat funktioniert. Jetzt wollte ich dieses Programm so abändern, das dieses Verzeichnisscannen in einem Thread läuft. Man soll ja den Code des Threads in der Synchronize-Methode ausführen. Dieser Kann man ja aber keine Funktion mit Parametern übergeben.
Synchronize(&ScanDir); //richtig Synchronize(&ScanDir(Verzeichnispfad)); //nicht zulässigjetzt meine frage:
Wie löse ich das Problem? Wie rufe ich die Funktion recursive auf, ohne einen Parameter übergeben zu dürfen? Mit einer globalen Variable / Klassenmember bekomme ich das ja nicht hin, wenn sich der Wert der Variable ständig ändert, wärend die funktion mehrfach abgearbeitet wird, oder?
Ich habe bestimmt nur einen Denkfehler...
vielen Danke für eure Hilfe im Voraus
mfg Stephan
-
Hi,
also ich hätte die Funktion in Execute() aufgerufen.
Synchronize() nutzen wenn Änderungen an Aktualisierungen an Objekten anstehen.
-
Hallo
Um die Antwort von Heinzelmännchen noch zu präzisieren :
Nicht Synchronize soll die Arbeitsfunktion aufrufen, sondern die Arbeitsfunktion soll Synchronize aufrufen wenn es etwas zu synchronizieren gibt.
Siehe auch das Forums-Tutorial.bis bald
akari
-
Also Synchronize nicht generell immer einsetzen, sondern nur, wenn auf Daten zugegriffen wird, auf die evtl. noch jemand anders zugreift. Hab mich da wohl von den vielen "Synchronize or Die" Sprüchen hypersensibilisieren lassen ;o)
danke euch vielmals
PS: der Erstaufruf von der Funktion erfolgt natürlich in Execute().
Nur wenn ich die Funktion rekursiv erneut aufrufe, muss ich ja wieder Synchronize verwenden. Das war mein Denkfehler. Ich brauch für so einen Algorithmus ja gar kein Sync. Danke euch nochmalvoid __fastcall TReadDirTree::Execute() { //---- Hier den Thread-Code plazieren---- Synchronize(&ScanDir); }mfg Stephan