Laden...

backgroundworker fortschritt in progressbar anzeigen

Erstellt von 55Flo55 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.917 Views
5
55Flo55 Themenstarter:in
37 Beiträge seit 2010
vor 13 Jahren
backgroundworker fortschritt in progressbar anzeigen

Vermutlich gibt es hierzu schon tausend beiträge, jedoch haben mir all diese beiträge noch nicht weitergeholfen.

Zum Thema wie poste ich richtig:
Gerne hätte ich in meinen Büchern gelesen wie dieses Problem zu beheben ist, jedoch gibt es zum backgroundworker nicht mal nen einzeiler dazu.

und zwar,

mein programm sortiert meine mp3's in entsprechende Ordner.

Dies klappt soweit, jedoch bekomme ich es einfach nicht hin, dass erfasst wird, wie weit der Fortschritt ist.

Meine Versuche scheitern damit, dass dann die Fehlermeldung kommt "Es sei threadübergreifend" bzw.

wenn ich diesen fehler behoben habe, passiert gar nichts in richtung progressbar änderung.

ich habe es auch schon mit


private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{
    progressbar1.value = AnzahlDerSortiertenLieder;

}

versucht, jedoch funktionierte dies auch nicht, obwohl ich die eigenschaft workreportsprocess auf true gesetzt habe.

Allerdings könnte mein Problem hiermit zusammenhängen

ReportProgress

ich weiß jedoch nicht wie ich dies verwenden sollte und wofür das nützlich ist.

Gelöschter Account
vor 13 Jahren

wenn ich diesen fehler behoben habe, passiert gar nichts in richtung progressbar änderung.

Wie behebst du diesen Fehler ?

Du kennst Invoke und Invoke Required?
Normalerweise kommt hier gleich ein Aufpasser und postet "Warum blockiert mein Gui" aber vermutlich stimmt die Uhrzeit dafür nicht.

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo zusammen,

... aber vermutlich stimmt die Uhrzeit dafür nicht.

Doch, die stimmt fast immer 😃

Guck dir mal den folgenden FAQ Eintrag an: [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Setze mal einen Breakpoint auf diese Zeile (progressbar1.value = AnzahlDerSortiertenLieder;) um zu sehen ob dein Programm überhaupt soweit kommt.

Rufst du überhaupt die ReportProgress Methode auf?

Noch ein kleiner Wink mit dem Zaunpfahl: Achte darauf dass du die ReportProgress-Methode nicht zu oft aufrufst.
Wenn du das nämlich nach jedem Lied machst, dann hängt sich die GUI ziemlich sicher halb auf und du siehst keinen Fortschritt.
Mach das besser zyklisch oder alle x Lieder einmal.

Gruss
Michael

68 Beiträge seit 2008
vor 13 Jahren

Wie wäre es, wenn du uns einfach mal die 3 berühmten BackgroundWorker-Events zeigst? Kürze einfach die irrelevanten IO-Stellen der mp3s heraus.

5
55Flo55 Themenstarter:in
37 Beiträge seit 2010
vor 13 Jahren

Die ReportProgress methode rufe ich nicht auf,
wenn mir jemand kurz erklären könnte wofür diese steht,
und wie ich sie verwende wäre mir sehr geolfen.


private void backgroundWorker1_ProgressChanged(object         sender,ProgressChangedEventArgs e)
        {
            progressBar2.Value = AnzahlDerSortiertenLieder;
        }

        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(checkedListBox1.Items.Count + "wurden sortiert.");
        }

Die Backgroundworker_DoWork methode erledigt ihre Aufgaben reibunslos, jedoch die anderen Beiden Methoden nicht....

Hinweis von michlG vor 13 Jahren

Bitte die CSHARP-Tags für den Code verwenden, damit dieser besser leserlich wird.

Danke

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

Methoden bzw. Klassen bitte immer vorher in der MSDN nachschlagen denn dort sind diese schön erklärt 😃
Guckst du hier: MSDN Backgroundworker - ReportProgress Methode

Diese Methode löst das Event ProgressChanged aus und du kannst die Prozentanzahl des Fortschrittes mitgeben.

Setze mal testweise einen Breakpoint in deinen Methoden dann siehst du dass diese überhaupt nicht aufgerufen werden.

Wie gesagt ist es auch noch wichtig dass du das Event nicht zu oft auslöst, weil das könnte die GUI blockieren

Gruss
Michael

29 Beiträge seit 2009
vor 13 Jahren

Hallo,

um Michl's Aussage auf n Punkt zu bringen:

Du must die ReportProgress-Methode schon selbst aufrufen, wenn du das passende Event dazu nutzen willst.

Stell dir die Situation doch einfach mal vor: Woher sollte der Backgroundworker wissen, wieviel seiner anstehenden Arbeit erledigt ist? Das musst du dann schon selbst lösen.

Sicherlich wirst du im Backgroundworker-Thread irgendeine Art von Schleife verwenden. Dann könntest du zum Beispiel vorher versuchen herrauszufinden wieviele Schleifendurchläufe durchgeführt werden. Diese Anzahl kannst du dann am Ende jedes Durchlaufs mit der Anzahl der Durchläufe abgleichen und schon hast du deinen "Fortschritt", den du per ReportProgress an den GUI-Thread übergeben kannst.

Gruß dev