Progressbar und Timer im extra Thread

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von siola52.

    Progressbar und Timer im extra Thread

    Servus,

    ich hänge mal wieder an einer Lösung, ich hab zwar schon viel hier gelesen aber ich komm nicht weiter.
    Warscheinlich liegt es daran das ich Multitreading einfach nicht kapiere.

    Zu meinem Problem:
    Ich möchte eine Progressbar unabhängig vom sonstigen Programmablauf füllen.
    Die Zeit dafür ist vom Benutzer wählbar, gehen wir aber mal von 10 Sekunden aus.
    Die Progressbar ist 680 lang und später hab ich noch vor die einzelnen Punkte zur Steuerung abzufragen.

    Habs mit einem FormsTimer probiert, aber der wird ja unterbrochen wenn ich was zusätzliches verarbeite.

    Für mich ist es der system.timers.timer im eigenen Tread, aber ich bekomme es einfach nicht hin die Progressbar zu füllen.

    Danke schon mal für die Hilfe
    Alois
    Fang mal an und mach das (zunächst) mit einem Backgroundworker, da findest Du beliebig viele Beispiele im Forum, und Du kannst Dich mit der Materie vertraut machen.
    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!

    siola52 schrieb:

    Ja SpaceyX, der Zugriff...
    Hab auch schon mit INVOKE rumprobiert aber ich bekomme es nicht gebacken

    Invoke ist ab VS2010 ziemlich unproblematisch:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ' threadpool
    3. ThreadPool.QueueUserWorkItem(Sub() fillProgressbar(ProgressBar1, 10 * 1000))
    4. ' oder Thread
    5. 'Dim t As New Thread(Sub() fillProgressbar(ProgressBar1, 10 * 1000)) With {.IsBackground = True}
    6. 't.Start()
    7. End Sub
    8. Private Sub fillProgressbar(ByVal progressbar As ProgressBar, ByVal durationMS As Integer)
    9. Dim maximum As Integer
    10. ' hole maximum des Progressbar (meist 100, in dem Fall 680)
    11. progressbar.Invoke(Sub() maximum = progressbar.Maximum) ' wenn man Progressbar anspricht, tunlichst immer über Invoke
    12. ' errechne Wartezeit
    13. Dim waitMS As Integer = durationMS \ maximum
    14. ' loop in
    15. Dim value As Integer = 0
    16. While value <= maximum
    17. progressbar.Invoke(Sub() ProgressBar1.Value = value) ' und wieder invoken, da wir Wert setzen
    18. value += 1
    19. Threading.Thread.Sleep(waitMS)
    20. End While
    21. Debug.Print("fill finished")
    22. End Sub

    @Myrax richtig

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

    Problem gelöst und das mit nur ein paar Zeilen.

    Mir war nicht ganz klar das der Timers.Timer ja automatisch in einem eigenen Thread läuft.
    Jetzt ist mir auch einiges klarer was das Threading betrifft

    Ich hab zwar schon viel geschafft und es läuft aber ob es nicht einfacher ginge weis man erst später, es fehlt ja noch einiges an Wissen.

    Danke an alle
    Könntest du die lösung bitte posten? Würde mich und wahrscheinlich auch andere interessieren.

    Edit://
    oder hast dus jetzt einfach nur mit nem Timer gemacht?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Servus Gather,

    ja ich hab es mit System.Timers.Timer gelöst.
    Hier ein Auschnitt dazu:

    VB.NET-Quellcode

    1. Dim WithEvents HilfsFeld As New TextBox 'Hilfstextbox zur Auslösung der Bildmarkerabfrage
    2. Public TimerInterval As Double 'Wird in Steuerung, Musiksteuerung, BildTimer verwendet
    3. Public BildTimer As New System.Timers.Timer() 'Wird in Steuerung, Musiksteuerung, BildTimer verwendet
    4. AddHandler BildTimer.Elapsed, AddressOf BildTimerTickEvent
    5. Me.BildTimer.AutoReset = True
    6. Me.BildTimer.Interval = TimerInterval 'Zuweisung Intervall
    7. Public Sub BildTimerTickEvent(sender As Object, e As EventArgs)
    8. 'Bei jedem Tick weiterzählen
    9. Me.MarkerPunktZaehler += 1
    10. 'Mit Invoke wegen separatem Thread den Wert setzen
    11. Me.Invoke(Sub() Me.HilfsFeld.Text = CStr(Me.MarkerPunktZaehler - 8))
    12. End Sub

    Das Hilfsfeld verwende ich um ein Event auszulösen, ich wollte es ausserhalb des Threads laufen lassen und mir ist nichts besseres eingefallen.
    Ich hoffe das die Spezialisten hier ein wenig Nachsicht üben wenn der Code nicht ganz richtig ist aber er funktioniert.
    Für Verbesserungen und Anregungen bin ich dankbar.
    Gruß Alois