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ässig
    

    jetzt 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 nochmal

    void __fastcall TReadDirTree::Execute()
    {
    	//---- Hier den Thread-Code plazieren----
    
    	Synchronize(&ScanDir);
    }
    

    mfg Stephan


Anmelden zum Antworten