Order und Inhalt kopieren - Form "Keine Rückmeldung"

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von BillyB.

    Order und Inhalt kopieren - Form "Keine Rückmeldung"

    Hallo Leute,

    auf meiner Windows Form habe ich einen Button und wenn ich diesen anklicke, dann soll das Programm einen Ordner und dessen Inhalt in einen anderen Ordner auf der selbern Festplatte kopieren. Der Ordner wird auch kopiert, aber meine Form gibt dann keine Rückmeldung mehr.

    Hier mein verwendeter Code:

    VB.NET-Quellcode

    1. Dim InstPfad As String = Application.StartupPath
    2. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    3. My.Computer.FileSystem.CopyDirectory(InstPfad & "\PRotos Software\Arduino\arduino-1.0\", "C:\Programme\3D-Drucker\Arduino\", True)
    4. End Sub




    Grüße



    Billy
    Willkommen im Forum. :thumbup:

    BillyB schrieb:

    aber meine Form gibt dann keine Rückmeldung mehr.
    Völlig klar, Du lässt ja Deine Form im Untergrund arbeiten, da hat sie keine Zeit, sich zu aktualisieren.
    Lagere den ganzen Code in einen BackgroundWorker aus.
    Such auf der Hauptseite nach BackgroundWorker.
    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!
    Danke schonmal für deine Hilfe!

    Ich habe das jetzt soweit, das er das schonmal im Hintergrund macht und das die Form nicht hängt.

    Gibt es auch noch ein Gegenteil von bgw.RunWorkerAsync() ? Oder springt der automatisch nach bgw_RunWorkerCompleted wenn er "End Sub" von bgw_DoEvents erreicht hat?

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

    Der BGW beendet seien Arbeit, wenn er mit BGW.DoWork() fertig ist und meldet dies in seinem Event RunWorkerCompleted().
    Da der BGW in einem separaten Thread läuft, benötigst Du keinerlei DoEvents().
    Diese DoEvents() solltest Du übrigens aus Deinem VB-Vokabular streichen, denn das gehört zu den "bösen Funktionen", die alles mögliche tun und ggf. noch viel mehr, was nicht beabsichtigt ist.
    Einzelne Controls kannst Du sich mit MyControl.Update() neu zeichnen lassen.
    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!
    Hallo, danke für deine Hilfe, das ist sehr nett und professionell.

    In der Sub RunWorkerCompleted() habe ich eine MsgBox, dass heißt wenn er fertig ist mit dem Kopieren soll er mir das melden - macht er aber nicht. Ich beobachte immer den Zielort und der Ordner samt Inhalt (22mb) wird auch erstellt, aber die MsgBox kommt nicht.
    Hi,

    habe den Code hier aus dem Forum:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Form1
    3. Private WithEvents bgw As New BackgroundWorker
    4. Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
    5. 'hier kommt der code hin, welcher zulange dauert
    6. 'so löst du progresschanged aus
    7. bgw.ReportProgress (...)
    8. End Sub
    9. Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
    10. 'von hier aus kannst du auf andere threads zugreifen z.b. steuerlemenente
    11. End Sub
    12. Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
    13. 'das hier wird am ende (wenn DoWork abgeschlossen ist) angesprungen
    14. End Sub
    15. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    16. bgw.WorkerReportsProgress = True 'damit du auf andere threads zugreifen kannst
    17. bgw.WorkerSupportsCancellation = True 'damit du den bgw auch abbrechen kannst
    18. End Sub
    19. End Class
    scheint richtig zu sein. hast du mal haltpunkte am ende der DoWork-Sub eingefügt? läuft der code tatsächlich bis zum ende?

    oder einen haltepunkt zu beginn der RunWorkerCompleted-Sub? (um sicherzustellen, dass das event ausgelöst wird)
    Kleine Info noch: Es könnte vielleicht daran liegen, dass die WorkerReportsProgess Eigenschaft standardmäßig auf False gesetzt ist.
    Ich würde zwar vermuten, dass damit nur die ReportProgress-Sub nicht aufgerufen wird, aber man weiß ja nicht so genau.
    Zum Abbrechen gibt es noch die Eigenschaft WorkerSupportsCancellation.
    Siehe auch [VB.NET] Multithreading mit BackgroundWorker
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Guten Morgen!

    Ich habe mal mit Haltepunkten gearbeitet und dummerweise hat sich nur herausgestellt, dass der Ordner nicht 22mb groß ist sondern 220mb :rolleyes: !

    Jetzt funktioniert das aber wie es soll, dauert halt nur länger. zur Benutzerfreundlichkeit werde ich noch eine Fortschrittsanzeige einbauen. Da benutze ich aber die Forensuche :thumbup:



    Danke euch!



    Edit: Noch eine Frage - ich habe zwar schon die Boardsuche benutzt und bin auch fündig geworden, aber der code geht bei mir nicht


    VB.NET-Quellcode

    1. My.Computer.FileSystem.CopyDirectory(InstPfad & "\PRotos Software\Arduino\arduino-1.0\arduino.exe", "C:\Programme\3D-Drucker\Arduino", True, FileIO.UIOption.AllDialogs)

    Kann ich den "Kopierstatus" von Microsoft auch einfach in meine ProgressBar übernehmen ?

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

    Für die Fortschrittsanzeige kannst du einfach im bgw_ProgressChanged über e.ProgressPercentage den Fortschritt anzeigen und den Wert an die Progressbar übergeben.
    Wie du im Backgroundworker die Prozent berechnest musst du dann selber herausfinden :)


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



    danke für den hinweis, ich habe das jetzt so gemacht. in der form 2 befindet sich meine progressbar, die hängt aber und lädt nicht wenn ich den bgw starte. bei ProgressChanged steht drin Form2.Progressbar1.Value = e.ProgressPercentage


    VB.NET-Quellcode

    1. Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    2.  MsgBox("Arduino wird nun installiert!", MsgBoxStyle.Information, "Hinweis!")
    3. Form2.Show()
    4. Threading.Thread.Sleep(2000)My.Computer.FileSystem.CopyDirectory(InstPfad & "\PRotos Software\Arduino\arduino-1.0", "C:\Programme\3D-Drucker\Arduino\", True)
    5. BGW.ReportProgress(1)
    6.  End Sub
    Sieh Dir mal dieses Beispiel an.
    Form, Button, BGW, Progressbar:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. BackgroundWorker1.RunWorkerAsync()
    4. End Sub
    5. Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    6. Me.ProgressBar1.Value = e.ProgressPercentage
    7. End Sub
    8. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    9. For i As Integer = 5 To 100 Step 5
    10. System.Threading.Thread.Sleep(20)
    11. BackgroundWorker1.ReportProgress(i)
    12. Next
    13. End Sub
    14. Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    15. MessageBox.Show("Fertich")
    16. End Sub
    17. End Class
    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!
    Hmmmm...

    Ich habe eine Form1 das ist meine Mainform. Wenn ich da auf Button2 klicke startet er den Kopierprozess. Nun soll mir in Form2 in der ProgressBar1 den Status des Windows Kopierfenster anzeigen. Das soll nicht mal prozentual sein oder mit Zeit, sondern einfach nur die ProgressBar vom Windows Kopierfenster, also 1:1.

    BillyB schrieb:

    Hmmmm...
    Hast Du einfach mal mein Beispiel in einem neuen separatern kleinen Testprogramm ausgeführt?
    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!
    @Rod das nützt ihm nichts, da die von ihm angewannte Methode keine (Prozent-)Werte über den aktuellen Fortschritt mitteilt. Es lässt sich lediglich das Standard-Windowsfenster für Kopierprozesse (de-)aktivieren. Die Übergabe eines Fortschittswerts mit Hilfe eines Events nützt ihm nichts, da er keinen Fortschrittswert hat.
    Ich ziele darauf, das Verzeichnis-Kopieren in ein File-Kopieren umzuminzen und über die Anzahl Soll / Ist einen Wert zu ermitteln.
    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!