Hochzählen im Backgroundworker

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Hochzählen im Backgroundworker

    Hallo Hallo,

    ich komme mal wieder an einer Stelle nicht weiter... Und zwar bearbeite ich mehrere Bilder in einer Schleife.
    Diese Schleife ist in einem Backgroundworker.

    Jetzt will ich den Progress dieses Backgroundworkers ausgeben komme aber da nicht weiter... Bisher sieht der Worker so aus:


    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. If Not IO.Directory.Exists(Folder & "/klein/") Then
    3. System.IO.Directory.CreateDirectory(Folder & "/klein/")
    4. End If
    5. For Each Files As String In Directory.GetFiles(Folder, "*.jpg")
    6. Dim FileName As String = IO.Path.GetFileName(Files)
    7. Dim oBitmap As Bitmap
    8. oBitmap = New Bitmap(Folder & "\" & FileName)
    9. 'PictureBox1.Load(Folder & "\" & FileName)
    10. bildNachher = AutoSizeImage(oBitmap, 1024, 1536, False)
    11. bildNachher.Save(Folder & "/klein/" & FileName, Imaging.ImageFormat.Jpeg)
    12. bildNachher.Dispose()
    13. oBitmap.Dispose()
    14. Dim i as Integer
    15. i=i+t
    16. BackgroundWorker1.ReportProgress(i)
    17. Next
    18. End Sub



    Und die Ausgabe so:

    VB.NET-Quellcode

    1. Private Sub backgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    2. ProgressBar1.Value = e.ProgressPercentage
    3. End Sub


    So habe ich es probiert, aber das Ende vom Lied ist, dass es nicht geht und auch mit einer For-Schleife klappt es nicht... Vielleicht jemand einen Tipp für mich?
    Mit "es geht nicht" ist der Sachverhalt natürlich auf den Punkt genau beschrieben^^ Ne ernsthaft: was geht nicht? Gibt es eine Exception, wenn ja, welche und in welcher Zeile?

    Was mir sofort auffällt: Die Variable i sollte außerhalb des Schleifenblock deklariert werden. Außerdem muss i eine Prozentzahl (also ein Wert von 0 bis 100) sein - aktuell ist es aber eher der Index der aktuellen Datei.

    Option Strict On hast du ganz oben als erste Zeile geschrieben hoffe ich^^
    Wenn ich es außerhalb mache wird es in der Schleife nicht erkannt...

    Und wenn es in der schleife ist so wie da, dann passiert nichts... Versuche ich es in einem Label auszugeben bricht die Schleife nach dem ersten Foto ab bzw. ist beendet...

    Und dabei ist es egal ob ich Prozent oder sonst was versuche auszugeben...
    Du musst es außerhalb der Schleife deklarieren, schreib es mal in Zeile 8. Ansonsten wird i bei jedem Schleifendruchlauf neu gesetzt => der Wert ändert sich nicht. Btw: was ist die Variable t?

    Wie man Prozent ausrechnet weißt du?
    prozente as Integer = cint ( abgearbeitet / gesamtanzahl)

    friloo schrieb:

    wird es in der schleife rot unterstrichen
    Welcher Text wird dazu angezeigt (ggf. nach Compile)?
    Probier mal außerhalöb der Schleife

    VB.NET-Quellcode

    1. Dim i As Integer = 0
    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!
    Richtig, zu einem solchen Fehler ein Eintrag in der Fehlerliste angezeigt. Der hilft meistens schon weiter das Problem zu lösen, einfach nur "ist rot/blau unterstrichten" reicht also zur Beschreibung des Problems nicht aus^^

    Falls du garnicht weiterkommst poste den veränderten Code.

    friloo schrieb:

    i nicht deklariert
    Wer lesen kann, hat echt Vorteile.

    RodFromGermany schrieb:

    Probier mal außerhalb der Schleife

    VB.NET-Quellcode

    1. Dim i As Integer = 0
    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!
    Also ich hätte das ja so gemacht:

    VB.NET-Quellcode

    1. Dim dir As New DirectoryInfo(Path.Combine(folder, "klein"))
    2. If Not dir.Exists Then dir.Create()
    3. Dim files = dir.GetFiles("*.jpg")
    4. For i = 0 To files.Length - 1
    5. Dim oBitmap As New Bitmap(files(i).FullName)
    6. oBitmap = AutoSizeImage(oBitmap, 1024, 1536, False)
    7. oBitmap.Save(files(i).FullName, Imaging.ImageFormat.Jpeg)
    8. oBitmap.Dispose()
    9. BackgroundWorker1.ReportProgress((i + 1) * 100 \ files.Length)
    10. Next

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

    friloo schrieb:

    Doof bin ich nicht...
    Weiß ich nicht. :D
    Poste mal den ganzen Code.
    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!

    friloo schrieb:

    Von ganzen Programm?
    Den relevanten Code, der Deinen Effekt reproduziert.
    Kopiere ihn ggf. in ein separates Projekt und teste Deinen Effekt, damit nicht iwelche anderen Sachen fehlen.
    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!