Erstellung von Fortschrittsbalken

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Panavia.

    Erstellung von Fortschrittsbalken

    Hallo und frohe Weihnachten.

    Bevor die Fresserei losgeht würde ich Euch gern noch eine Frage stellen, damit ich nach den Feiertagen an meinem Progi weiterschreiben kann ;)

    Ich führe mittlerweile recht viele Berechnungen durch und weil einige große Schleifen eingebaut wurden dauert diese unter Umständen auch etwas länger.
    Um dem Nutzer ein Feedback zu geben, würde ich gerne einen Fortschrittsbalken einfügen, der in einem gesonderten Fenster erscheint.
    Die Parameter der ProgressBar sind mir bekannt. Kennt Ihr vielleicht eine ellegante Lösung, wie man diese zur Anzeige bringen kann und der Fortschritt auch "live" angezeigt wird?

    Vielen Dank!

    Gruß,
    Tobias
    Hallo Panavia,

    Was meinst du mit "live" anzeigen? Also dass sich der Balken ständig nach rechts bewegt ohne dass man auf einen Butten klicken muss oder so? Spontan würde mir da ein Timer einfallen der den Balken jede Sekunde aktualisiert..oder du packst direkt ans Ende deiner Schleife eine Anweisung dass der Balken sich ändern soll, das frisst allerdings, je nachdem wie oft du deine Schleifen durchläufst, recht viel Leistung (jedenfalls war es bei mir so).

    Ich hoffe ich konnte dir helfen!

    MfG Sepp
    Hallo,

    das mit "Marquee" wusste ich jetzt nicht. Dann ist das natürlich einfach. Ich öffne das Fenster beim Start der Berechnung und lasse es am Ende wieder schließen...
    Mit "live" meinte ich eigentlich, dass der Balken z.B. bei 60 oder 80% der insgesamt angefallenen Berechnungen auch das entsprechende, also 60 oder 80% anzeigt.
    Allerdings muss ich dann wohl erst definieren, was genau als Maßstab zu definieren ist und dann Statusabfragen in den Code einflechten.
    Das ist mir aber zu umständlich... Der Nutzer soll nur das Gefühl bekommen, dass der Rechner sich nicht aufgehängt hat ;)

    Vielen Dank und schöne Feiertage!

    An dieser Stelle an Alle auch herzlichen Dank für die vielen tollen Hilfestellungen bei meinen Problemchen dieses Jahr!

    Gruß,
    Tobias

    Panavia schrieb:

    Hallo,

    das mit "Marquee" wusste ich jetzt nicht. Dann ist das natürlich einfach. Ich öffne das Fenster beim Start der Berechnung und lasse es am Ende wieder schließen...
    Mit "live" meinte ich eigentlich, dass der Balken z.B. bei 60 oder 80% der insgesamt angefallenen Berechnungen auch das entsprechende, also 60 oder 80% anzeigt.
    Allerdings muss ich dann wohl erst definieren, was genau als Maßstab zu definieren ist und dann Statusabfragen in den Code einflechten.
    Das ist mir aber zu umständlich... Der Nutzer soll nur das Gefühl bekommen, dass der Rechner sich nicht aufgehängt hat ;)

    Vielen Dank und schöne Feiertage!

    An dieser Stelle an Alle auch herzlichen Dank für die vielen tollen Hilfestellungen bei meinen Problemchen dieses Jahr!

    Gruß,
    Tobias

    Da passt besser Marquee dazu, weil so musst du nichts berechnen.
    Hallo Panavia,

    Marquee zeigt dir im Prinzip nur an, dass dein Prog noch lebt.

    Wenn du den Fortschritt anzeigen lassen willst musst du
    1. natürlich die 100% definieren
    2. Jeden weiteren Prozentwert entsprechend anzeigen
    3. Dafür sorgen, dass die Progressbar refreshed wird - einfach den Wert innerhalb der Berechnungen ändern hilft da gar nichts.

    Stichwort:
    Backgroundworker
    ReportProgress

    Gruss

    mikeb69
    Hallo,

    vielen Dank. Habe ich mir schon gedacht, dass die Anzeige von absoluten Prozentwerten der Berechnung recht kompliziert wird.
    Es wäre allein schon sehr umständlich zu definieren, was 100% sind, weil das stark von den Eingabend es Nutzers abhängt...

    Ich habe mich schon damit abgefunden, dass die ProgressBar dann nur anzeigt ob mein Progi noch lebt!

    Allerdings klappt das nicht so wie gedacht. Ich habe die Bar in mein WinForm eingefügt als Visible=False und will sie dann mit Visible=True sichtbar machen.
    Allerdings zeigt sich die Bar erst nach Abschluss der Berechnungen, die etwa 5 Sekunden dauern...
    Hier mal die Struktur, wie der Code momentan aussieht:

    VB.NET-Quellcode

    1. Private Sub Button_Calculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Calculate.Click
    2. ProgressBar.Visible = True
    3. ProgressBar_Label.Visible = True
    4. Call BaseCalculation()
    5. If DropDown_Option.SelectedIndex > 0 Then
    6. Call OptionCalculation()
    7. End If
    8. ProgressBar.Visible = False
    9. ProgressBar_Label.Visible = False
    10. Call ShowResults()
    11. End Sub


    Hat da jemand eine Idee, wie man das zum laufen bekommen kann?

    Danke,
    Tobias
    Entweder du lagerst deine Berechnung in einen eigenen Thread aus (Stichwort Threadsicheres Update / Delegates )

    oder aber du sorgst dafür, dass deine App am "Anfang" der Berechnungen noch schnell die Progressbar einblendet:

    progressbar.visible = true
    Application.DoEvents()

    kann dir da helfen.

    grüße,
    dognose
    Ich dachte durch die Verlagerung in andere Bereiche und das Aufrufen mit "Call" hätte ich schon andere Threats. Ehrlich gesagt kenne ich mich diesbezüglich mit der Benennung solcher Vorgänge garnicht aus...
    Allerdings gefällt mir der BackgroundWorker sehr gut, kann jedoch diesbezüglich wenig Tutorials finden.
    Könntet ihr mir da ein bisschen anhand des obigen Beispiels helfen, wie man den Aufruft? Das würde mir extrem helfen.

    Danke,
    Tobias
    Danke für die Tips.
    Habe es soweit auch hinbekommen allerdings habe muss ich threat-übergreifend den Status eines Dropdownmenüs abfragen.
    Habt Ihr da einen Tip? Das geht aus der msdn-Seite nicht hervor, wie das geht...

    VB.NET-Quellcode

    1. Private Sub Button_Calculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Calculate.Click
    2. ProgressBar.Visible = True
    3. ProgressBar_Label.Visible = True
    4. BackgroundWorker.RunWorkerAsync()
    5. End Sub
    6. Private Sub BackgroundWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
    7. Call Calculations01()
    8. If DropDown.SelectedIndex > 0 Then
    9. Call Calculations02()
    10. End If
    11. End Sub
    12. Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted
    13. ProgressBar.Visible = False
    14. ProgressBar_Label.Visible = False
    15. Call Results()
    16. End Sub


    Also er mault bei:

    VB.NET-Quellcode

    1. If DropDown.SelectedIndex > 0 Then
    2. Call Calculations02()
    3. End If


    Vielen Dank!
    Tobias

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

    Die Fehlermeldung lautet:
    "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement DropDown erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

    Nach einigem Nachlesen über den Backroundworker ist mir jetzt der Fehler ansich auch klar.
    Allerdings muss es doch eine Möglichkeit geben, während der Laufzeit den Status des DropDown-Menüs zu ermitteln.
    Oder muss man vor Starten des Backgroundworkers den Inhalt/Status aller Eingabe- und Steuerelemente in Public Variables schreiben?
    Ich kann nicht die komplette Grundstruktur meines Progis neu aufbauen, dafür ist es schon zu komplex...

    Keine Lösung???

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