Aktivitätsanzeige steht während RunSpaces arbeiten
Hallo Forum.
Ich möchte einen Ladebalken laufen lassen der anzeigt das das Programm gerade arbeitet. Ohne die RunSpaces funktioniert die Anzeige. Was muss ich ändern damit der Balken auch während der RunSpaces läuft?
Gruß
HighSpeed1
Ich möchte einen Ladebalken laufen lassen der anzeigt das das Programm gerade arbeitet. Ohne die RunSpaces funktioniert die Anzeige. Was muss ich ändern damit der Balken auch während der RunSpaces läuft?
# --- Form ---
$FormSizeX = 510
$FormSizeY = 100
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "TEST"
$Form.Size = New-Object System.Drawing.Size($FormSizeX,$FormSizeY)
$Form.MinimumSize = New-Object System.Drawing.Size($FormSizeX,$FormSizeY)
$Form.MaximumSize = New-Object System.Drawing.Size($FormSizeX,$FormSizeY)
$Form.StartPosition = 'CenterScreen'
$Form.TopMost = $true
#$Form.ControlBox = $false
#$Form.ShowInTaskbar = $false
# --- StatusBar---
$StatusBar = New-Object System.Windows.Forms.StatusBar
$StatusBar.Location = New-Object System.Drawing.Size($ProgressBarLocationX,$ProgressBarLocationY)
$StatusBar.Text = "Loading RunSpaces ..."
$Form.Controls.Add($StatusBar)
# --- Ladebalken ---
$ProgressBarLocationX = 10
$ProgressBarLocationY = 10
$ProgressBarSizeX = $FormSizeX - (2 * $ProgressBarLocationX) - 20
$ProgressBarSizeY = 20
$ProgressBar = New-Object System.Windows.Forms.ProgressBar
$ProgressBar.Location = New-Object System.Drawing.Size($ProgressBarLocationX,$ProgressBarLocationY)
$ProgressBar.Size = New-Object System.Drawing.Size($ProgressBarSizeX,$ProgressBarSizeY)
$ProgressBar.Value = 100
$ProgressBar.Style = "Marquee"
$ProgressBar.MarqueeAnimationSpeed = 50
$Form.Controls.Add($ProgressBar)
# === RunSpaces ===
$Form.add_shown({
$ScriptBlock = {
param(
[Parameter(Mandatory)] [hashtable] $Parameters
)
sleep -Milliseconds $Parameters.Milliseconds
}
$Parameters = @{}
$Parameters.add('Milliseconds',5000)
$RunSpace_1 = [powershell]::Create()
$RunSpace_1.AddScript($ScriptBlock) | Out-Null
$RunSpace_1.AddArgument($Parameters) | Out-Null
$Handle_1 = $RunSpace_1.BeginInvoke()
while ($Handle_1.IsCompleted -like $true) {}
$Return_RunSpace_1 = $RunSpace_1.EndInvoke($Handle_1)
$Form.Close()
})
pause
[void]$Form.ShowDialog()
Gruß
HighSpeed1
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 33368481096
Url: https://administrator.de/forum/aktivitaetsanzeige-steht-waehrend-runspaces-arbeiten-33368481096.html
Ausgedruckt am: 23.12.2024 um 14:12 Uhr
4 Kommentare
Neuester Kommentar
Schon wieder?!
Powershell Kopiervorgang und StatusBar mit hochlaufender Prozentzahl
Tipp dein Fehler ist die Schleife:
.
Powershell Kopiervorgang und StatusBar mit hochlaufender Prozentzahl
Tipp dein Fehler ist die Schleife:
while ($Handle_1.IsCompleted -like $true) {}
.
Du hast das Prinzip mit den unterschiedlichen Threads und dem UI Thread immer noch nicht gecheckt, wenn du den UI Thread durch eine Warte-Schleife blockierst kann dieser die Form nicht aktualisieren, deswegen stoppt auch die Progressbar, ganz einfach ....!!
Done.
Add-Type -A System.Windows.Forms
$proxy = [hashtable]::Synchronized(@{})
$ps = [powershell]::Create()
$ps.Runspace.SessionStateProxy.SetVariable("dataproxy",$proxy)
$form = New-Object System.Windows.Forms.Form -P @{
ClientSize = '250,50'
Text = "Status"
MinimizeBox = $false
MaximizeBox = $false
add_Shown = {
$ps.AddScript({
# lang laufende Aktion durchführen ...
sleep 5
# habe fertig, Form schließen
$dataproxy.form.Close()
})
$ps.BeginInvoke()
}
}
$pbar = [System.Windows.Forms.ProgressBar]@{
Dock = "Fill"
Style = 'Marquee'
MarqueeAnimationSpeed = 50
}
$proxy.progressbar = $pbar
$proxy.form = $form
$form.Controls.Add($pbar)
[void]$form.ShowDialog()
$ps.Dispose()