Benutzer mit den meisten Antworten
ProgressBar soll im Vordergrund ablaufen

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
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
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
-
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
-
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
-
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
-
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
- Bearbeitet Robert BreitenhoferModerator Mittwoch, 14. Dezember 2011 14:39 Verstanden
-
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
-
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