Question WPF et Thread

Plus d'informations
il y a 12 ans 4 mois #16385 par Richard Lazaro
WPF et Thread a été créé par Richard Lazaro
Bonjour tout le monde,

Je pense qu'o na déjà du en parler et je pense que ce post va devenir violent trés vite techniquement.

En gros, voilà mon besoin :
J'ai une IHM via laquelle je veux piloter des actions, mais bien sur je veux le moins de freeze possible (WPF = STA ...)

Voici les différentes idées que j'ai eu :
Background Job : Le problème est lors de l'initialisation du BJ ... cela provoque un freeze de quelques secondes (lors du premier surtout)
Runspaces : avec cet article learn-powershell.net/2012/10/14/powershe...-different-runspace/ (pour info dans le code il manque Add-Type -AssemblyName PresentationFramework | Out-Null) mais j'arrive pas à intéragir avec le runspace via le dispatcher ... puis surtout comment sortir l'event du click sur un bouton dans un autre runspace
Background Runspace : Tiré idée de cet article learn-powershell.net/2012/05/13/using-ba...-better-performance/ pour avoir une initialization plus rapide, mais j'arrive pas trop à récupérer les données lors du changements d'état ...

Je sais pas si j'ai été le plus clair possible ...

Avez vous déjà rencontré ce besoin ? si oui, vous êtes passé par quoi ?

Richard.<br><br>Message édité par: Richard Lazaro, à: 22/11/13 16:31

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 4 mois #16386 par Richard Lazaro
Actuellement j'ai ce code :

[code:1]
Add-Type -AssemblyName PresentationFramework | Out-Null

[xml]$g_XAML = @\&quot;
&lt;Window
xmlns=\&quot;schemas.microsoft.com/winfx/2006/xaml/presentation\";
xmlns:«»x=\&quot;schemas.microsoft.com/winfx/2006/xaml\";
Title=\&quot;MainWindow\&quot; Height=\&quot;350\&quot; Width=\&quot;525\&quot;&gt;
&lt;Grid&gt;
&lt;ProgressBar HorizontalAlignment=\&quot;Left\&quot; Height=\&quot;66\&quot; Margin=\&quot;34,59,0,0\&quot; VerticalAlignment=\&quot;Top\&quot; Width=\&quot;453\&quot; IsIndeterminate=\&quot;True\&quot;/&gt;
&lt;Button x:Name=\&quot;btn_progress\&quot; Content=\&quot;LAUNCH\&quot; HorizontalAlignment=\&quot;Left\&quot; Margin=\&quot;85,168,0,0\&quot; VerticalAlignment=\&quot;Top\&quot; Width=\&quot;221\&quot; Height=\&quot;105.96\&quot;/&gt;
&lt;Rectangle x:Name=\&quot;rec_rpogress\&quot; Fill=\&quot;#FFE21717\&quot; HorizontalAlignment=\&quot;Left\&quot; Height=\&quot;105.96\&quot; Margin=\&quot;359,168,0,0\&quot; Stroke=\&quot;Black\&quot; VerticalAlignment=\&quot;Top\&quot; Width=\&quot;107\&quot;/&gt;

&lt;/Grid&gt;
&lt;/Window&gt;
\&quot;@

$g_XAMLReader = (New-Object System.Xml.XmlNodeReader $g_XAML)
$g_WPF=[Windows.Markup.XamlReader]::Load( $g_XAMLReader )

$global:wpf_Btn = $g_WPF.FindName('btn_progress')
$global:wpf_Rec = $g_WPF.FindName('rec_rpogress')

$wpf_action = $wpf_Btn.add_click
$wpf_action.Invoke({
$newPowerShell = [PowerShell]::Create().AddScript({Start-Sleep -Seconds 5})
$job = $newPowerShell.BeginInvoke()
Write-Host \&quot;Raise Event 1\&quot;
Register-ObjectEvent -InputObject $newPowerShell -EventName InvocationStateChanged `
-Action {
Write-Host \&quot;Raise Event 2\&quot;
$global:wpf_Rec.Fill = (New-Object System.Windows.Media.SolidColorBrush '#FF036408')
}
})

$g_WPF.ShowDialog() | Out-Null
[/code:1]

Je dois louper quelque chose ... mais mon event n'est jamais raise.

EDIT : Alors j'ai découvert quelque chose.
Si je reclick sur le bouton (d'ailleurs désolé, il y 'a un reste d'un blague avec un collègue ...) alors là le resultat apprait et le rectangle passe au vert<br><br>Message édité par: Richard Lazaro, à: 21/11/13 17:21

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 3 mois #16396 par Richard Lazaro
Réponse de Richard Lazaro sur le sujet Re:WPF et Thread
Personne n'a une idée ?
Avec les grands esprits sur ce forum (hahem oui il faut bien flatter), je suis déçu ;)

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 3 mois #16401 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:WPF et Thread
Richard Lazaro écrit:

Personne n'a une idée ?
Avec les grands esprits sur ce forum (hahem oui il faut bien flatter), je suis déçu ;)


Salut Richard,

Sans me considérer comme un \&quot;grand esprit sur ce forum\&quot; :/ je suis désolé de ne pas pouvoir te répondre.

Ok pour moi pour ce qui touche à l'infra (OS Windows, beaucoup AD, moyennement SCCM, VMWare, un peu Citrix, ...) mais alors la gestion d'interface graphique via PowerShell :(

Ça m'est arrivé, mais ce n'est pas pour moi une spécialité et je préfère de loin le Shell et les Cmdlets (un peu logique, je suis un Admin. J'utilise aussi souvent le 'Write-Progress').

Au départ, j'ai été 'emmerdé' avec les freeze d'interface, et j'ai vite abandonné (aussi faute de temps). Cela me rappelle d'ailleurs un sujet posté ici, où j'avais finalement indiqué qu'il est peut être préférable de développer des GUI avec d'autres langages (C++, C#, VB .Net, Dév Web ...).

Toutefois, je rencontre encore régulièrement des GUI développées en PowerShell (par Exakis, par ex), mais systématiquement, je constate qu'une fois le traitement lancé, l'interface se fige, soit temporairement, soit tout le temps du traitement. Et pour une usine à gaz qui peut nécessiter un suivi d'avancement ainsi qu'une utilisation débridée, je trouve cela plutôt moyen, en tout cas discutable :whistle:

Peut être que Laurent ou une autre personne pourra(ont) te renseigner.

Je précise que cette discussion m'intéressera ;)

Au passage, voir le module ShowUI :

ShowUI: the tutorial walkthrough

New-SimpleForm – Holy dynamic GUI Batman!

About ShowUI

@ +

Matthew<br><br>Message édité par: Matthew BETTON, à: 23/11/13 14:44

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 3 mois #16410 par SiSMik
Réponse de SiSMik sur le sujet Re:WPF et Thread
Salut Richard,

J'ai tenté le même truc que toi, mais je n'ai jamais vriament réussi à faire communiqer les runspaces entre eux.

Si tu y arrives, je suis preneur, j'ai changé de boîte avant d'avoir à trouver la solution :D

@+<br><br>Message édité par: benduru, à: 25/11/13 16:00

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 3 mois #16417 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:WPF et Thread
Salut,
Richard Lazaro écrit:

Je sais pas si j'ai été le plus clair possible ...

Pour moi, avant d'être une question de clarté c'est déjà une question de contexte.
Perso, je ne suis pas dans ton contexte, ce qui amène déjà un décalage.
Si tu pouvais expliciter le comportement attendu, ce serait plus mieux :-)
Richard Lazaro écrit:

mon event n'est jamais raise.

Déclencher, c'est bien aussi.
Richard Lazaro écrit:

je suis déçu

Dans ce cas essaie les forums US.

Je partage l'avis de Matthew :
Matthew BETTON écrit:

il est peut être préférable de développer des GUI avec d'autres langages (C++, C#, VB .Net, Dév Web ...).

PS n'est pas fait pour ça. Ce n'est pas parce qu'on peut le faire qu'il est le plus adapté pour le faire.
Maintenant si certains le font c'est aussi parce que d'autres le leur demande, et que parfois ils ne peuvent leur refuser.
Faut juste attendre deux ou trois râteaux en maintenance pour que ça commence à rentrer.
Combien êtes vous dans votre service à pouvoir maintenir ce code ? Un admin peut-il le faire ?

Ceci-dit, as-tu essayé d'inverser, i.e. de coder ton GUI à partir de WPF en y intégrant du Powershell ?
Richard Lazaro écrit:

Je dois louper quelque chose

Je ne sais pas, mais confondre peut être.
Si tu appelles une méthode asynchrone à la dotnet, j'ai un doute sur son couplage avec la mécanique d'event de PowerShell.
Ensuite le type de la variable $Job est internal(warning) et la classe [PowerShell] est Disposable (Memory Leak).

Une autre approche qui ne résout pas ton pb, mais met en évidence qq comportements :
[code:1]
Add-Type -AssemblyName PresentationFramework | Out-Null

[xml]$g_XAML = @\&quot;
&lt;Window
xmlns=\&quot;schemas.microsoft.com/winfx/2006/xaml/presentation\";
xmlns:«»x=\&quot;schemas.microsoft.com/winfx/2006/xaml\";
Title=\&quot;MainWindow\&quot; Height=\&quot;350\&quot; Width=\&quot;525\&quot;&gt;
&lt;Grid&gt;
&lt;ProgressBar HorizontalAlignment=\&quot;Left\&quot; Height=\&quot;66\&quot; Margin=\&quot;34,59,0,0\&quot; VerticalAlignment=\&quot;Top\&quot; Width=\&quot;453\&quot; IsIndeterminate=\&quot;True\&quot;/&gt;
&lt;Button x:Name=\&quot;btn_progress\&quot; Content=\&quot;LAUNCH\&quot; HorizontalAlignment=\&quot;Left\&quot; Margin=\&quot;85,168,0,0\&quot; VerticalAlignment=\&quot;Top\&quot; Width=\&quot;221\&quot; Height=\&quot;105.96\&quot;/&gt;
&lt;Rectangle x:Name=\&quot;rec_rpogress\&quot; Fill=\&quot;#FFE21717\&quot; HorizontalAlignment=\&quot;Left\&quot; Height=\&quot;105.96\&quot; Margin=\&quot;359,168,0,0\&quot; Stroke=\&quot;Black\&quot; VerticalAlignment=\&quot;Top\&quot; Width=\&quot;107\&quot;/&gt;

&lt;/Grid&gt;
&lt;/Window&gt;
\&quot;@

$g_XAMLReader = (New-Object System.Xml.XmlNodeReader $g_XAML)
$g_WPF=[Windows.Markup.XamlReader]::Load( $g_XAMLReader )

$global:wpf_Btn = $g_WPF.FindName('btn_progress')
$global:wpf_Rec = $g_WPF.FindName('rec_rpogress')

$wpf_action = $wpf_Btn.add_click
$wpf_action.Invoke({
Write-Host (\&quot;Raise Event 1 : {0}\&quot; -F (get-date))
$Job = Start-Job -scriptblock {Start-Sleep -Seconds 5}
Register-ObjectEvent -InputObject $Job -EventName StateChanged -Action {
Write-Host \&quot;Raise StateChanged\&quot;
$eventname=$EventArgs.JobStateInfo.ToString()
Write-Host (\&quot;{0} : {1}\&quot; -F $eventname,(get-date)) -fore green
if ($eventname -eq 'Completed')
{
if ($global:wpf_Rec.Fill -eq \&quot;#FFE21717\&quot;«»)
{$Fill='#FF036408'}
else
{$Fill=\&quot;#FFE21717\&quot;}
$global:wpf_Rec.Fill = (New-Object System.Windows.Media.SolidColorBrush $fill)
}
}#Register-ObjectEvent
})

$g_WPF.ShowDialog() | Out-Null
Get-Date
[/code:1]
Avec cette approche il faut toutefois supprimer les job et les jobs d'abonnement à l'event.
Les event sont déclenchés, mais la réception du résultat d'exécution reste en suspend...<br><br>Message édité par: Laurent Dardenne, à: 25/11/13 20:54

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.111 secondes
Propulsé par Kunena