highspeed1
Goto Top

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?

1

# --- 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

Content-ID: 33368481096

Url: https://administrator.de/contentid/33368481096

Ausgedruckt am: 27.09.2024 um 23:09 Uhr

10138557388
10138557388 16.01.2024 aktualisiert um 13:29:07 Uhr
Goto Top
Schon wieder?!
Powershell Kopiervorgang und StatusBar mit hochlaufender Prozentzahl

Tipp dein Fehler ist die Schleife:
while ($Handle_1.IsCompleted -like $true) {}

face-big-smile.
HighSpeed1
HighSpeed1 16.01.2024 aktualisiert um 13:51:32 Uhr
Goto Top
Hallo pjupmer.

Leider funktioniert es auch nicht wenn ich es in add_shown packe. Ich muss ja keine laufenden Daten übergeben. Der Balken läuft ja von alleine. Nur nicht wenn parallel etwas anderes läuft. In einen RunSpace packen bringt auch nichts...

Wenn ich die While-Zeile ausblende funktioniert es genausowenig.
HighSpeed1
HighSpeed1 16.01.2024 um 13:57:02 Uhr
Goto Top
Es liegt scheinbar an add_shown. Selbst wenn ich nur ein sleep einbaue bleibt die Anzeige hängen.

$Form.add_shown({
    sleep -Milliseconds 50000
}
10138557388
10138557388 16.01.2024 aktualisiert um 16:15:01 Uhr
Goto Top
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 ....!!

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()
Done.