Question WPF et Thread
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 12 ans 3 mois #16385
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
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
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.
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 12 ans 3 mois #16386
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:[Discussion] WPF et Thread
Actuellement j'ai ce code :
[code:1]
Add-Type -AssemblyName PresentationFramework | Out-Null
[xml]$g_XAML = @\"
<Window
xmlns=\"schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:«»x=\"schemas.microsoft.com/winfx/2006/xaml\"
Title=\"MainWindow\" Height=\"350\" Width=\"525\">
<Grid>
<ProgressBar HorizontalAlignment=\"Left\" Height=\"66\" Margin=\"34,59,0,0\" VerticalAlignment=\"Top\" Width=\"453\" IsIndeterminate=\"True\"/>
<Button x:Name=\"btn_progress\" Content=\"LAUNCH\" HorizontalAlignment=\"Left\" Margin=\"85,168,0,0\" VerticalAlignment=\"Top\" Width=\"221\" Height=\"105.96\"/>
<Rectangle x:Name=\"rec_rpogress\" Fill=\"#FFE21717\" HorizontalAlignment=\"Left\" Height=\"105.96\" Margin=\"359,168,0,0\" Stroke=\"Black\" VerticalAlignment=\"Top\" Width=\"107\"/>
</Grid>
</Window>
\"@
$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 \"Raise Event 1\"
Register-ObjectEvent -InputObject $newPowerShell -EventName InvocationStateChanged `
-Action {
Write-Host \"Raise Event 2\"
$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
[code:1]
Add-Type -AssemblyName PresentationFramework | Out-Null
[xml]$g_XAML = @\"
<Window
xmlns=\"schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:«»x=\"schemas.microsoft.com/winfx/2006/xaml\"
Title=\"MainWindow\" Height=\"350\" Width=\"525\">
<Grid>
<ProgressBar HorizontalAlignment=\"Left\" Height=\"66\" Margin=\"34,59,0,0\" VerticalAlignment=\"Top\" Width=\"453\" IsIndeterminate=\"True\"/>
<Button x:Name=\"btn_progress\" Content=\"LAUNCH\" HorizontalAlignment=\"Left\" Margin=\"85,168,0,0\" VerticalAlignment=\"Top\" Width=\"221\" Height=\"105.96\"/>
<Rectangle x:Name=\"rec_rpogress\" Fill=\"#FFE21717\" HorizontalAlignment=\"Left\" Height=\"105.96\" Margin=\"359,168,0,0\" Stroke=\"Black\" VerticalAlignment=\"Top\" Width=\"107\"/>
</Grid>
</Window>
\"@
$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 \"Raise Event 1\"
Register-ObjectEvent -InputObject $newPowerShell -EventName InvocationStateChanged `
-Action {
Write-Host \"Raise Event 2\"
$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.
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 12 ans 3 mois #16396
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
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
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.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 968
- Remerciements reçus 0
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:
Salut Richard,
Sans me considérer comme un \"grand esprit sur ce forum\" :/ 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
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
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 \"grand esprit sur ce forum\" :/ 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
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.
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
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
@+<br><br>Message édité par: benduru, à: 25/11/13 16:00
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
@+<br><br>Message édité par: benduru, à: 25/11/13 16:00
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 3 mois #16417
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:WPF et Thread
Salut,
Richard Lazaro écrit:
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:
Richard Lazaro écrit:
Je partage l'avis de Matthew :
Matthew BETTON écrit:
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:
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 = @\"
<Window
xmlns=\"schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:«»x=\"schemas.microsoft.com/winfx/2006/xaml\"
Title=\"MainWindow\" Height=\"350\" Width=\"525\">
<Grid>
<ProgressBar HorizontalAlignment=\"Left\" Height=\"66\" Margin=\"34,59,0,0\" VerticalAlignment=\"Top\" Width=\"453\" IsIndeterminate=\"True\"/>
<Button x:Name=\"btn_progress\" Content=\"LAUNCH\" HorizontalAlignment=\"Left\" Margin=\"85,168,0,0\" VerticalAlignment=\"Top\" Width=\"221\" Height=\"105.96\"/>
<Rectangle x:Name=\"rec_rpogress\" Fill=\"#FFE21717\" HorizontalAlignment=\"Left\" Height=\"105.96\" Margin=\"359,168,0,0\" Stroke=\"Black\" VerticalAlignment=\"Top\" Width=\"107\"/>
</Grid>
</Window>
\"@
$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 (\"Raise Event 1 : {0}\" -F (get-date))
$Job = Start-Job -scriptblock {Start-Sleep -Seconds 5}
Register-ObjectEvent -InputObject $Job -EventName StateChanged -Action {
Write-Host \"Raise StateChanged\"
$eventname=$EventArgs.JobStateInfo.ToString()
Write-Host (\"{0} : {1}\" -F $eventname,(get-date)) -fore green
if ($eventname -eq 'Completed')
{
if ($global:wpf_Rec.Fill -eq \"#FFE21717\"«»)
{$Fill='#FF036408'}
else
{$Fill=\"#FFE21717\"}
$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
Richard Lazaro écrit:
Pour moi, avant d'être une question de clarté c'est déjà une question de contexte.Je sais pas si j'ai été le plus clair possible ...
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:
Déclencher, c'est bien aussi.mon event n'est jamais raise.
Richard Lazaro écrit:
Dans ce cas essaie les forums US.je suis déçu
Je partage l'avis de Matthew :
Matthew BETTON écrit:
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.il est peut être préférable de développer des GUI avec d'autres langages (C++, C#, VB .Net, Dév Web ...).
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 ne sais pas, mais confondre peut être.Je dois louper quelque chose
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 = @\"
<Window
xmlns=\"schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:«»x=\"schemas.microsoft.com/winfx/2006/xaml\"
Title=\"MainWindow\" Height=\"350\" Width=\"525\">
<Grid>
<ProgressBar HorizontalAlignment=\"Left\" Height=\"66\" Margin=\"34,59,0,0\" VerticalAlignment=\"Top\" Width=\"453\" IsIndeterminate=\"True\"/>
<Button x:Name=\"btn_progress\" Content=\"LAUNCH\" HorizontalAlignment=\"Left\" Margin=\"85,168,0,0\" VerticalAlignment=\"Top\" Width=\"221\" Height=\"105.96\"/>
<Rectangle x:Name=\"rec_rpogress\" Fill=\"#FFE21717\" HorizontalAlignment=\"Left\" Height=\"105.96\" Margin=\"359,168,0,0\" Stroke=\"Black\" VerticalAlignment=\"Top\" Width=\"107\"/>
</Grid>
</Window>
\"@
$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 (\"Raise Event 1 : {0}\" -F (get-date))
$Job = Start-Job -scriptblock {Start-Sleep -Seconds 5}
Register-ObjectEvent -InputObject $Job -EventName StateChanged -Action {
Write-Host \"Raise StateChanged\"
$eventname=$EventArgs.JobStateInfo.ToString()
Write-Host (\"{0} : {1}\" -F $eventname,(get-date)) -fore green
if ($eventname -eq 'Completed')
{
if ($global:wpf_Rec.Fill -eq \"#FFE21717\"«»)
{$Fill='#FF036408'}
else
{$Fill=\"#FFE21717\"}
$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.062 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- WPF et Thread