progressbar programmieren

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Schamash.

    progressbar programmieren

    Hallo Alle,

    nachdem ich mir bereits Blasen an die Finger gegoogelt habe ;( stelle ich in meiner Verzweiflung folgende Frage:

    wie programmiert man eine Progressbar, welche mitläuft solange ich auf das Ende eines ausgeführten externen Programmes warte?
    Hier mein Code der das Ext. Proggi ausführt:

    Private Sub Sendbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Sendbutton.Click

    Dim adress, news, answer As String
    Dim cmd
    Dim p As New Process()

    adress = Adressbox.Text
    news = Newsbox.Text
    answer = Answerbox.Text
    cmd = " \\" & adress & " msg /time:3600 /v /w * " & news


    p.StartInfo.FileName = "D:\Sysinternals\psexec.exe"
    p.StartInfo.Arguments = cmd
    p.StartInfo.UseShellExecute = False
    p.StartInfo.RedirectStandardOutput = True
    p.StartInfo.CreateNoWindow = True
    p.Start()
    answer = p.StandardOutput.ReadToEnd()
    p.WaitForExit()
    p.Close()
    Answerbox.Text = answer

    End Sub

    Das Proggi startet psexec mit den Parametern und "sendet" eine Nachricht auf den Zielrechner und wartet bis der User diese bestätigt. Die Rückmeldung von Psexec wird dann in der Answerbox dargestgellt. Während dieser Wartezeit soll die Progressbar laufen. Wenn der User die Meldung bestätigt soll die Progressbar natürlich entsprechend abbrechen. Für jede Hilfe dankbar ;)
    Da hast du aber doch gar keinen Progress! Entweder es wurde bestätigt oder nicht.

    Du könntest die progressbar auf style Marquee stellen.

    und per visible = false oder True anzeigen oder nicht.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Am Besten du verwendest eine Progressbar mit dem Style Marquee und stellst den MarqueeSpeed auf 10.
    Dann lauft in der Progressbar so ein grüner Schimmer immer von links nach rechts, was zeigen soll, dass das Programm arbeitet.
    Wenn fertig reicht es glaub ich den Speed auf 0 zu stellen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Antwort wurde bereits von fichz bzw. Schamash gepostet...

    Anmerkung für den TE:
    Bitte formatiere deinen Code mit dem [code=vbnet] {code} [/code] Tag
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^
    Hi,

    zunächst danke für die Antworten. Die Progressbar soll laufen von Buttonklick bis zum Eingang der Bestätigung maximal aber eine Stunde(Automatisches Ende der Wartezeit.) Also quasi die Anzeige der Wartezeit. Ich hab es mit verschiedenen Codes versucht aber entweder wir nur der Balken angezeigt ohne Verlauf oder gar nichts(Progressbar verschwand nach Buttonclick. ;( ). Wie und an welcher Stelle codiere ich das am besten?
    im Button.click lässt du die Progressbar anzeigen (entweder visible = true oder Marqueespeed >0. Dadurch der der Style auf Marquee steht läuft dann einfach ein Balken von links nach rechts durch ( je nach Speed in unterschiedlicher Geschwindigkeit.

    Wenn die Bestätigung des Users erfolg ist setzt die die Progressbar wieder auf Visible=false (oder dem Speed auf 0)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Hallo Schamash,

    danke dir für die Idee. ich habe jetzt zunächst die Progressbar so Deklariert:

    VB.NET-Quellcode

    1. Dim Progressbar As New ProgressBar With {.Style = ProgressBarStyle.Continuous, .Dock = DockStyle.Bottom, .MarqueeAnimationSpeed = 50}



    und dann so versucht sie anzuzeigen:


    VB.NET-Quellcode

    1. ProgressBar.Visible = True
    2. p.StartInfo.FileName = "D:\Sysinternals\psexec.exe"
    3. p.StartInfo.Arguments = cmd
    4. p.StartInfo.UseShellExecute = False
    5. p.StartInfo.RedirectStandardOutput = True
    6. p.StartInfo.CreateNoWindow = True
    7. p.Start()
    8. answer = p.StandardOutput.ReadToEnd()
    9. p.WaitForExit()
    10. Progressbar.Visible = False
    11. p.Close()
    12. Answerbox.Text = answer


    Fehler zeigt er mir so keine an aber das Proggi scheint abzustürzen. Nach Buttonclick geht nichts mehr ;( Was mach ich da bloß falsch?
    1. style sollte Marquee sein.

    2. Ich bin nicht sicher aber "blockiert" dein Process nicht die Form solange er auf Exit wartet?

    Ich bin nicht so bewandert in Netzwerkkomunikation, aber ich denke du müsstest den Process in einen BackGroundWorker auslagern damit er nicht die Form blockiert.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Danke für die Korrekturen.

    das mit dem Blockieren könnte stimmen aber sollte er nicht zumindest die Progressbar anzeigen? Nach Buttonclick passiert auf der Form nichts. ;(

    ich denke wenn ich das Objekt deklariere und vor dem Ausführen des Prozesses einblende sollte es zumindest erscheinen?

    Ich glaub ich seh den Wald vor lauter Christbäumen nicht :S
    Blockieren friert die Form ein. Da passiert gar nix, bis der Exit kommt.

    VB.NET-Quellcode

    1. Dim Progressbar As New ProgressBar With {.Style = ProgressBarStyle.Marquee, .Dock = DockStyle.Bottom, .MarqueeAnimationSpeed = 50}

    Erstellt zwar eine Progressbar, zeigt sie aber nicht an. Ich würde die an deiner stelle über den Designer erstellen und nur auf visible true/false im Code stellen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    mach es dir doch ganz einfach. lege dir ein timer auf die form und vebinde den value-wert des progressbar mit dem timer-tick.
    etwa sowas hier:

    VB.NET-Quellcode

    1. ProgressBar1.Style=ProgressBarStyle.Continous
    2. ProgressBar1.Minimum=0
    3. ProgressBar1.Maximum=3600
    4. ProgressBar1.Step=1
    5. Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button.Click
    6. ...
    7. ...
    8. Process.Start(".....")
    9. Timer1.Interval=1000
    10. Timer1.Start()
    11. End Sub
    12. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    13. If ProgressBar1.Value<ProgressBar1.Maximum Then
    14. ProgressBar1.PerformStep()
    15. Else
    16. Process.Exit
    17. End If
    18. End Sub


    So zeigt der ProgressBar die aktuelle Wartezeit an und der Bar voll ist wird der Process beendet
    Einfacher kannste nicht machen, wenn du ne abbruchbedingung mit rein basteln willst.
    Hallo Schamash,

    das mit dem Designer war mein erster Anlauf. Da zeigt er nur den Balken an. Wenn ich dann im Code die Visible-Geschichte mit rein mach, stürzt das Proggi wie gesagt scheinbar ab. Deshalb die andere Deklaration. Ich denke ich mach mich mal an den BackgroundWorker. Könntest du mir sagen wie ich das angehe. Das kenne ich leider noch nicht. ?(

    Hallo affrop,

    das mit dem Timer hatte ich auch schon bedacht aber da ja die Wartezeit unbestimmt ist(bis auf die Maximalzeit) schien mir das nicht elegant zu sein. Die Bar sollte ja bei Bestätigung, spätestens bei erreichen der Max-Time abbrechen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    na du kannst doch drüber schreiben "Max-Wartezeit bis zu m automatischen Abbruch" dann lässt einfach die bar runter laufen.
    kommt das ergebnis eher kannst die bar ausblenden lassen und den timer stoppen.
    schon haste dein gewünschtes ziel erreicht.
    und mit dem backgrounworker musstes auch blos so machen. der bgw berichtet den aktuellen stand der prozesses an die bar. wird der prozess abgebrochen beendet sich der bgw und der bar bleibt bei dem value stehen oder setzt ihn manuell wieder auf 0.
    prinzip ist das selbe.
    Also jetzt bin ich dank affrop's idee soweit, das die Progressbar funktioniert und auch angezeigt wird. Soweit vielen Dank dafür.
    Leider wird die Anzeige aber nicht während der Wartezeit angezeigt, sondern erst wenn das externe Programm fertig ist. ?(

    ;( So langsam gehen mir die Taschentücher aus. Heuel, Schluchz, schrei... ;(

    So sieht mein Code derzeit aus:

    VB.NET-Quellcode

    1. Private Sub Sendbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Sendbutton.Click
    2. Dim adress, news, answer, cmd As String
    3. Dim p As New Process()
    4. ProgressBar.Style = ProgressBarStyle.Blocks
    5. ProgressBar.Minimum = 0
    6. ProgressBar.Maximum = 3600
    7. ProgressBar.Step = 10
    8. adress = Adressbox.Text
    9. news = Newsbox.Text
    10. answer = Answerbox.Text
    11. cmd = " \" & adress & " msg /time:3600 /v /w * " & news
    12. ProgressBar.Visible = True
    13. p.StartInfo.FileName = "D:\Sysinternals\psexec.exe"
    14. p.StartInfo.Arguments = cmd
    15. p.StartInfo.UseShellExecute = False
    16. p.StartInfo.RedirectStandardOutput = True
    17. p.StartInfo.CreateNoWindow = True
    18. p.Start()
    19. Timer1.Interval = 1000
    20. Timer1.Start()
    21. answer = p.StandardOutput.ReadToEnd()
    22. p.WaitForExit()
    23. p.Close()
    24. Answerbox.Text = answer
    25. End Sub
    26. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    27. If ProgressBar.Value < ProgressBar.Maximum Then
    28. ProgressBar.PerformStep()
    29. Else
    30. ProgressBar.Visible = False
    31. End If
    32. End Sub

    Schamash schrieb:

    Blockieren friert die Form ein. Da passiert gar nix, bis der Exit kommt.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Hallo Affrop,

    ich hatte nur die 10 eingestellt, damit ich Veränderungen schneller sehe. ;)

    Also ich habe die Zeilen vertauscht und verschoben. Bar taucht auf, fängt aber erst nach Rückmeldung des ext. Proggis an zu laufen ;(


    Welche Anweisung führt denn eig. zum Blockieren? Wenn ich die p.waitforexit rausnehme bleibt das Ergebnis gleich.
    Blockieren demnach Prozesse grundsätzlich eine Form?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Hipfzwirgel“ ()