none
ProgressBar soll im Vordergrund ablaufen RRS feed

  • Frage

  • Hallo, das Powershell-Skript soll im Hintergrund ablaufen, die Form mit der ProgressBar im Vordergrund und natürlcih sollte der Balken aktualisiert werden. Ich hab mal den Code angehängt. Kann mir da jemand helfen?

    Danke Armin

    Private Sub Alle_Server_einlesen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim Lines = System.IO.File.ReadAllText("datei").Split(Environment.NewLine)

    Dim LineCount As Integer = Lines.Count

    LineCount = LineCount - 1

    ProgressBar1.Minimum = 0

    ProgressBar1.Maximum = LineCount

    ProgressBar1.Value = 0

    Dim i As Integer Form1.TreeView1.Nodes.Clear()

    Form1.ListBox1.Items.Clear()

    Form1.ListBox2.Items.Clear()

    For Each zeile As String In IO.File.ReadAllLines("datei_2")

           Form1.TreeView1.Nodes.Add(zeile)

           Dim sFilePathe_n As String = "datei3"

           Dim streami_n As FileStream = New FileStream(sFilePathe_n, FileMode.OpenOrCreate)

           Dim SWriter_n As StreamWriter = New StreamWriter(streami_n, System.Text.Encoding.Default)

           SWriter_n.WriteLine(zeile)

           SWriter_n.Close()

    If Dir("c:\TS_Tool\Benutzer.txt") <> "" Then

             Kill("c:\TS_Tool\Benutzer.txt")

    End If

    Dim p As Process = Process.Start("C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe", "c:\skript.ps1")

    p.WaitForExit()

    Dim benutzer_t As String

    For Each benutzer As String In IO.File.ReadAllLines("datei3")

           If benutzer.Contains("Active") Or benutzer.Contains("Disconnected") Then

               benutzer_t = RTrim(benutzer)

               Form1.TreeView1.Nodes(i).Nodes.Add(benutzer_t)

           End If

    Next

    ProgressBar1.Value = ProgressBar1.Value + 1

    Next

    End Sub


    • Bearbeitet AucheinName Donnerstag, 8. Dezember 2011 08:05
    Mittwoch, 7. Dezember 2011 08:37

Antworten

  • Hallo AucheinName,

    Ich weiß was Du sagst. Deshalb möchte ich Dich bitten nochmals zu lesen und zu testen den Link den ich Dir gegeben habe.

    VB.Net Asynchronous background worker inside a loop ...Stichwörter: Asynchron und Background(Worker) also es soll im Hintergrund(Background) laufen anstatt im Vordergrund drängeln und das ProcessBar-Fenster blockieren.

    Es gilt die Regel dass man auf die Oberfläche (dort wo Deine ProgressBar ist) nur über den GUI Thread (Vordergrund) zugreifen darf.

    Grüße,

    Robert

    • Als Antwort markiert AucheinName Montag, 19. Dezember 2011 08:35
    Donnerstag, 15. Dezember 2011 13:49
    Moderator

Alle Antworten

  • Hallo AucheinName,

    Welchen Progress soll die ProgressBar anzeigen?

    Kannst Du bitte Dein Problem deutlicher und völlig beschreiben?

    Umfasse mindestens die folgenden Schritte in der Beschreibung Deines Problems:

    1) Eine Übersicht der Funktionsweise von dem Programm

    2) Das Ergebnis des aktuellen Codes

    3) Was erwartest Du dass Dein Code machen soll

    4) Den Inhalt der Eingabedateien (falls zutreffend)

    Schau mal im folgenden Artikel wie man ein PowerShell-Skript von .NET-Code ausruft:

    Calling a PowerShell Script From Your .NET Code

    Danke und Grüße,

    Robert

    Dienstag, 13. Dezember 2011 15:36
    Moderator
  • Hallo Robert,

    mit folgenden zwei Zeilen ruf ich ein Powershell-Skript auf, und warte bis es abgearbeitet ist. Funktioniert auch Tip-Top.

    Allerdings möchte ich dass das Skript im Hintergrund abläuft (also z.B. nur in der Taskleiste erscheint) und im Vordergrund eine ProcessBar, bei der der Balken hochläuft bis die Aktion beendet ist. Tricker für den Balken sollte die Schleife in der sich das Skript befindet und die Gesamtzeilenzahl (LineCount)

    sein.

     

    Dim p As Process = Process.Start("C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe", "c:\skript.ps1")

    p.WaitForExit()

     

    Danke Armin

     

    Mittwoch, 14. Dezember 2011 07:37
  • Hallo AucheinName,

    Du hast keine Kontrolle über den Prozess, die in der DosBox ausgeführt wird. Daher können die Schritte von ProgressBar nicht gemessen werden. Eine ProgressBar braucht einen Begin, ein Ende und die Schritte, um das zu erreichen. Du hast nur den Begin.

    Prozess auslöst keine Ereignisse außer Exited. Es gibt also keine Möglichkeit zu wissen, was der Prozess tut.

    ProgressBar akzeptiert ein Prozesswert, aber die Zeit, indem Deine PowerShell-Datei ausgeführt wird, kann nicht ausgewertet werden.

    Sehr unschön J Um dieses Problem zu umgehen, kannst Du versuchen, die Zeit selbst zu bewerten, und Deine ProgressBar zu 90 % asynchron zu erhöhen (wenn Deine PowerShell-Datei ausgeführt wird). Nach dem WaitForExit machst Du sie als 100%.

    Schau Dir mal noch die folgenden Threads an damit Du verstehst wie die Sache aussieht:

    ProgressBar1 with Process.start...

    WPF threading for monitoring Process.Start and showing progress bar

    Zum lesen: Managing Processes and Threads in Windows Forms

    Grüße,

    Robert

    Mittwoch, 14. Dezember 2011 10:02
    Moderator
  • Hallo Robert,

    das Powershellskript wird innerhalb einer Schleife gestartet die Anzahl der Schleifen ergibt sich aus der Zeilenanzahl einer Textdatei, die zu Anfang ausgelesen wird (siehe Frage ganz oben). Meine Frage war jetzt die ProcessBar in den Vordergrund zu schieben und pro Schleife den Balken anteilmäßig vorwärts zu bringen.

    Aufgrund der Schleife bin ich aber gezwungen solange zu warten bis das Skript abgearbeitet ist.

    Mit ProcessStartInfo gäbe es zwar die Möglichkeit das Skript mit hidden im Hintergrund laufen zu lassen, ich habe aber keine Möglichkeit gefunden

    mit ProcessStartInfo auf das Skriptende zu warten.

    Gruß

    Armin

     

    Mittwoch, 14. Dezember 2011 13:10
  • Hallo AucheinName,

    Versuch mal folgendes: setzte am Anfang  ProgressBar1.Value = 1 und ProgressBar1.Step=1 und dann in der Schleife ruf ProgressBar1.PerformStep() à siehe Beispiel von ProgressBar.Step Property

    Warum machst Du LineCount = LineCount – 1 und nachher ProgressBar1.Maximum = LineCount? Maximum soll doch fix bleiben.

    Schau Dir mal noch folgendes an à VB.Net Asynchronous background worker inside a loop

    Grüße,

    Robert

    Mittwoch, 14. Dezember 2011 14:35
    Moderator
  • Hallo Robert,

    das Problem ist, dass die Powershellfenster sich in den Vordergrund drängeln und das ProcessBar-Fenster wird blockiert.

    Gruß

    Armin

    Donnerstag, 15. Dezember 2011 13:12
  • Hallo AucheinName,

    Ich weiß was Du sagst. Deshalb möchte ich Dich bitten nochmals zu lesen und zu testen den Link den ich Dir gegeben habe.

    VB.Net Asynchronous background worker inside a loop ...Stichwörter: Asynchron und Background(Worker) also es soll im Hintergrund(Background) laufen anstatt im Vordergrund drängeln und das ProcessBar-Fenster blockieren.

    Es gilt die Regel dass man auf die Oberfläche (dort wo Deine ProgressBar ist) nur über den GUI Thread (Vordergrund) zugreifen darf.

    Grüße,

    Robert

    • Als Antwort markiert AucheinName Montag, 19. Dezember 2011 08:35
    Donnerstag, 15. Dezember 2011 13:49
    Moderator
  • Hallo Robert,

    ich denke Dieses ist der richtige Weg. Allerdings habe ich keine Ahnung wie ich meine Schleife (siehe unten) dem Backgroungworker

    mit auf die reise geben kann. (Hab schon einige Beispiele durch)

    gruß

    Armin

     

     

    For Each zeile As String In IO.File.ReadAllLines("datei_2")

           Form1.TreeView1.Nodes.Add(zeile)

           Dim sFilePathe_n As String = "datei3"

           Dim streami_n As FileStream = New FileStream(sFilePathe_n, FileMode.OpenOrCreate)

           Dim SWriter_n As StreamWriter = New StreamWriter(streami_n, System.Text.Encoding.Default)

           SWriter_n.WriteLine(zeile)

           SWriter_n.Close()

               Dim p As Process = Process.Start("C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe", "c:\skript.ps1")

               p.WaitForExit()

    Next
    Donnerstag, 15. Dezember 2011 15:33