none
Progressbar per Backgroundworker RRS feed

  • Frage

  • Hallo,

    ich versuche Verzweifelt über eine Progressbar den Fortschritt einer Prozedur anzuzeigen der über ein Backgroundworker läuft.

    per Debug hab ich alle Prozedurschritte nachverfolgt so das er sogar den Befehl pbLadebalken.value= e.ProgressPercentage

    ausführt (e.ProgressPercentage enthält sogar ein Wert) aber will mir Perdu nicht die Änderung des Progessbar anzeigen.

    Habe es sogar mit Applications.doevents aus probiert aber ohne Erfolg.

    Irgenwas hab ich im Zusammenspiel mit dem Backgroundworker noch nicht Verstanden.

    Dank euch für eure Hilfe

    Daniel

    Dienstag, 4. Januar 2011 23:09

Antworten

  • Hallo Daniel,

    ein DoEvents oder andere Eingriffe sind nicht nötig. Leg mal ein Formular an (WinForms oder Wpf) mit einem Button & einem Progressbar; das kleine Beispiel zählt von 1 bis 100 in 0,2 sek Steps und aktualisert in "ProgressChanged" Event des BackGroundWorker die Fortschrittsanzeige:

    Imports System.ComponentModel

    Public Class Form1

        Private WithEvents mWorker As BackgroundWorker

        Private Sub DoSomeWork(ByVal sender As ObjectByVal e As DoWorkEventArgs)
            For i = 1 To 100
                mWorker.ReportProgress(i)
                ' Ein bisschen warten
                Threading.Thread.Sleep(200)
            Next
        End Sub

        Private Sub ButtonStart_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles ButtonStart.Click
            'BackgroundWorker erstellen ...
            mWorker = New BackgroundWorker
            mWorker.WorkerReportsProgress = True
            AddHandler mWorker.DoWork, AddressOf DoSomeWork
            '.. und starten
            mWorker.RunWorkerAsync()
        End Sub

        Private Sub mWorker_ProgressChanged(ByVal sender As ObjectByVal e As System.ComponentModel.ProgressChangedEventArgsHandles mWorker.ProgressChanged
            Me.ProgressBar1.Value = e.ProgressPercentage
        End Sub

    End Class

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Mittwoch, 5. Januar 2011 06:26
  • Hallo,

    ich versuche Verzweifelt über eine Progressbar den
    Fortschritt einer Prozedur anzuzeigen der über ein
    Backgroundworker läuft.

    per Debug hab ich alle Prozedurschritte nachverfolgt
    so das er sogar den Befehl
    pbLadebalken.value= e.ProgressPercentage ausführt
    (e.ProgressPercentage enthält sogar ein Wert) aber will
    mir Perdu nicht die Änderung des Progessbar anzeigen.

    Habe es sogar mit Applications.doevents aus probiert
    aber ohne Erfolg.

    .doevents ist hier sicher nicht das richtige Mittel.

    Irgenwas hab ich im Zusammenspiel mit dem
    Backgroundworker noch nicht Verstanden.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
        -> Multithreading / Backgroundworker
            -> BackGroundWorker-Threading

    findest Du ein Beispiel, bei dem mehrere Threads
    via BackGroundWorker laufen und dabei auch eine
    Progressbar kontinuierlich angesteuert wird.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)




    Dank euch für eure Hilfe

    Daniel

    Mittwoch, 5. Januar 2011 08:02

Alle Antworten

  • Hallo Daniel,

    ein DoEvents oder andere Eingriffe sind nicht nötig. Leg mal ein Formular an (WinForms oder Wpf) mit einem Button & einem Progressbar; das kleine Beispiel zählt von 1 bis 100 in 0,2 sek Steps und aktualisert in "ProgressChanged" Event des BackGroundWorker die Fortschrittsanzeige:

    Imports System.ComponentModel

    Public Class Form1

        Private WithEvents mWorker As BackgroundWorker

        Private Sub DoSomeWork(ByVal sender As ObjectByVal e As DoWorkEventArgs)
            For i = 1 To 100
                mWorker.ReportProgress(i)
                ' Ein bisschen warten
                Threading.Thread.Sleep(200)
            Next
        End Sub

        Private Sub ButtonStart_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles ButtonStart.Click
            'BackgroundWorker erstellen ...
            mWorker = New BackgroundWorker
            mWorker.WorkerReportsProgress = True
            AddHandler mWorker.DoWork, AddressOf DoSomeWork
            '.. und starten
            mWorker.RunWorkerAsync()
        End Sub

        Private Sub mWorker_ProgressChanged(ByVal sender As ObjectByVal e As System.ComponentModel.ProgressChangedEventArgsHandles mWorker.ProgressChanged
            Me.ProgressBar1.Value = e.ProgressPercentage
        End Sub

    End Class

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Mittwoch, 5. Januar 2011 06:26
  • Hallo,

    ich versuche Verzweifelt über eine Progressbar den
    Fortschritt einer Prozedur anzuzeigen der über ein
    Backgroundworker läuft.

    per Debug hab ich alle Prozedurschritte nachverfolgt
    so das er sogar den Befehl
    pbLadebalken.value= e.ProgressPercentage ausführt
    (e.ProgressPercentage enthält sogar ein Wert) aber will
    mir Perdu nicht die Änderung des Progessbar anzeigen.

    Habe es sogar mit Applications.doevents aus probiert
    aber ohne Erfolg.

    .doevents ist hier sicher nicht das richtige Mittel.

    Irgenwas hab ich im Zusammenspiel mit dem
    Backgroundworker noch nicht Verstanden.

    Unter

        www.gssg.de -> Visual Basic -> VB.net
        -> Multithreading / Backgroundworker
            -> BackGroundWorker-Threading

    findest Du ein Beispiel, bei dem mehrere Threads
    via BackGroundWorker laufen und dabei auch eine
    Progressbar kontinuierlich angesteuert wird.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)




    Dank euch für eure Hilfe

    Daniel

    Mittwoch, 5. Januar 2011 08:02
  • Hallo zusammen,

    Dank euch erstmal für die Hilfe.

    Die Verfahrensweise war mir bereits bekannt. Nur lief es trotzem nicht.

    Nun hab ich den Feher zwar gefunden aber nicht Verstanden.......

    Und zwar wollte ich die bwWorker.ReportProgress(0, "Aloftdaten werden werden geholt....") methode aus einer Public MustInherit Class herraus aufrufen

    in dieser Klasse konnte ich aber den bwWorkerthread nicht direkt erreichen und muste die UmgebendeKlasse angeben

    (frmHauptblatt.bwworker.ReportProgress.....)

    Ausserdem habe ich den bwworker per Drag&Drop aus der Toolbox auf die frmHaupt gezogen.

    Ich vermute das es irgenwas mit den Zugriffsberechtigungen zwischen den Klassen zutun hatte.

    Habe jetz den bwworker direckt in einem Modul instanzisiert und dort auch die Prozeduren geschrieben

    und nun läuft es

    Ich will das Problem das ich hatte nicht nur beseitigen sonder auch Verstehen.

    Es waren alle Prozeduren und Klassen Public gesetz eine noch höhere Freigabe gibt es ja net. Trotzdem lief es so wie oben Beschrieben nicht...Hab ich da was flasch gemacht (mit den Klassen)

    Schönen Tag euch

    Daniel

    Freitag, 7. Januar 2011 09:34
  • Donnerstag, 13. Januar 2011 09:36