brauche bitte Hilfe bei Codeoptimieung; Inhalt von Array abareiten

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von TomWi.

    brauche bitte Hilfe bei Codeoptimieung; Inhalt von Array abareiten

    Hallo Leute,

    ich will aus einem Ordner bestimmte vorgegebene Dateien löschen. Meine Umsetzung sieht so aus.
    Ich habe die Dateinamen ohne Pfadangabe in ein Array geschrieben.
    Dann wird für jeden Dateinamen eine neue Datei deklariert und diese wird dann in dem Ordner gelöscht. Der Code funktioniert, leider hängt sich die Form aber auf und es dauert auch sehr lange, bis das Dingens fertig ist.

    kann mir da evtl. jemand weiterhelfen?

    hier der Code

    VB.NET-Quellcode

    1. Dim Texturearray = {"Thread_N_512.tif", "Thread_B_hell_512.tif", "Thread_B_512.tif", "Thread_B_hell_512_18,06x18,06cm.tif", "Thread_B_normal.tif", "Thread_normalmap.tif", _
    2. "leder_dakota_schwarz_KACHELBAR_2_normalmap.tif", "leder_dakota_schwarz_KACHELBAR_2_normalmap_8,7x8,7cm_low.tif", "leder_dakota_schwarz_KACHELBAR_2k_4,3x4,3cm_low.tif", _
    3. "leder_dakota_Perlgrau_KACHELBAR.tif", "Feinnarbe_L_grau_5x5cm_kachelbar.tif", "Thread_hell.tif"} ', " *\([0-9]\)"}
    4. For Each Texture In Texturearray
    5. Dim pruefDatei As String = Path.Combine(FilePath, Texture)
    6. File.Delete(pruefDatei)
    7. Next


    Danke

    Tom

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TomWi“ ()

    Es beeinflusst weder die Dauer noch die Geschwindigkeit des Ablaufes, das Löschen passiert dann einfach unabhängig von der Form (die Form bleibt einfach nicht hängen sondern läuft normal weiter).
    hab es jetzt so gelöst

    VB.NET-Quellcode

    1. Private Delegate Sub removeoldtexturesdelegate(ByVal filename As String)


    VB.NET-Quellcode

    1. Dim deletefile As New Thread(New ThreadStart(Sub() RemoveOldTextures(openfilename)))
    2. deletefile.Start()


    Die Form hängt sich nun nicht mehr auf, aber es dauert wirklich ewig bis das Ding fertig ist.

    Gibt es da keine andere Lösung?

    EDIT:

    es dauert 49 Sekunden
    und wie lange hat es vorher gedauert, bis die Form wieder "aufgetaut" is?

    Die frage ist halt, wie groß die Dateien sind. wenn die mehrere GB belegen dauert das nun schon mal ne weile, bis windows gesagt hat, "hey hier is wieder Speicherplatz!"

    wie sieht es denn aus, wenn du die Dateien von Hand löschst, geht es da schneller?
    Wie lange dauert es denn, wenn Du sie von Hand löschst?
    Länger als 2...3 Sekunden sollte es nicht dauern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodfromGermany

    genau so ist es. Es dauert wirklich nicht länger. So stell ich mir das von meinem Programm auch vor

    EDIT:

    Ich bin mittlerweile nicht mehr im Büro am Rechner, sondern im Zug mit Laptop.

    Wenn ich das Ding auf dem Laptop ausführe, dann dauert es "nur" 11 sek.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TomWi“ ()

    also,

    es funktioniert jetzt. Dauert im Büro auch nur noch ca. 10-15 sek. Je nachdem, wieviel Dateien gelöscht werden. Das passt soweit.


    Ich wollte jetzt als Feature noch eine Progressbar einfügen.

    Die Texturen werden in Sub gelöscht, die ich von einem Thread aus starte


    VB.NET-Quellcode

    1. Private Delegate Sub removeoldtexturesdelegate(ByVal filename As String)

    VB.NET-Quellcode

    1. Dim removeoldtexture As New Thread(New ThreadStart(Sub() RemoveOldTextures(openfilename)))
    2. removeoldtexture.Start()



    wenn ich jetzt in dieser Sub die Progressbar ansprechen möchte, dann kommt ne Fehlermeldung mit "Threadübergreifend usw."

    woran kann das liegen und wie kann ich den Fehler beheben?


    EDIT:

    Wenn ich die Sub nicht in einem eigenen Thread starte, funktioniert zwar die Progressbar, aber die Form hängt sich wieder auf

    Tom

    TomWi schrieb:

    Threadübergreifend
    Du kannst von einem anderen Thred aus nicht GUI-Elemente verändern (wohl aber auslesen).
    Das Zauberwort heißt Invoke.

    VB.NET-Quellcode

    1. INSTANZ_DER_GUI.Invoke(Sub() INSTANZ_DER_GUI.Label1.Text = "Bla")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie bereits gesagt invoken. Was jedoch zusätzlich wichtig ist, dass du die ProgressBar angemessen verwendest. Was heißt das: Wenn ich Beispielsweise 500.000 Datensätze in ne Datenbank schreibe und bei jedem die Progressbar aktualisiere, wird der Vorgang gleich nen vielfaches an Zeit verschlingen. Was ich damit sagen möchte ist, dass gerade bei Performanceintensiven sachen die Aktualisierung von Fortschritten nur in gewissen Intervalen vorgenommen werden sollte. In meinem Beispiel z.B. alle 1000 Datensätze. Ich weiß nicht genau wie dein Szenario aussieht aber grundsätzlich einfach darauf achten, dass du nicht zu oft aktualisierst, da dies a) alles verlangsamt und b) wieder den GUI-Thread belastet und die Form somit wieder laggy wird.

    EDIT: Nö. Wenn du jedes mal eine neue Form instanzierst wird das recht schnell abschmieren und außerdem ist das auch sinnlos. Du solltest ausschließlich eine Instanz der Form haben(du willst den Status ja nicht immer auf einer neuen Form anzeigen sondern alle Aktualisierungen auf einer einzigen). Optimal wäre es natürlich wenn du ein Event erstellst, welches z.B. einen Prozentsatz und einen Text mitliefert. Dieses Event verarbeitest du dann in der Form und nimmst verwendest dort das Invoke. So wäre eine halbwegs schöne Architektur gewährleistet.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    TomWi schrieb:

    VB.NET-Quellcode

    1. Dim Form1 As New Form
    Hier erstellst Du doch eine neue Instanz. Du musst die vorhandene Instanz nehmen, z.B.

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Me.Label1.Text = "Bla")
    2. ' oder
    3. dlg.Invoke(Sub() dlg.Label1.Text = "Bla")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab es jetzt geschafft, die Progressbar zum laufen zu bringen.
    Die Lösung ist der Backgroundworker.

    Ich starte die Sub jetzt nicht mehr aus einem Thread, sondern über den Backgroundworker. Somit hängt sich die Form nicht mehr auf und die Progressbar läuft auch.

    Danke für die Hilfe

    Tom