Question
[Résolu] Besoin d'aide sur le multithread
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 9 ans 11 mois #21939
par Florent
[Résolu] Besoin d'aide sur le multithread a été créé par Florent
Bonjour,
J'ai besoin d'un eclaircissement sur le multithread en powershell. Je travaille sur le script d'un collègue, qui utilise la structure suivante :
-Un thread master qui ouvre les trois thread du dessous
-Un thread pour la GUI
-Un thread pour l'engine
-Un thread pour un timer
Les threads sont construit ainsi :
[code:1]Function StartRunSpaceForGui {
#-Creation et démarrage d'un RunSpace pour l'interface graphique.
$global:RunSpaceForGui=[runspacefactory]::CreateRunspace()
$global:RunSpaceForGui.ApartmentState=\"STA\"
$global:RunSpaceForGui.ThreadOptions=\"ReuseThread\"
$global:RunSpaceForGui.Open()
$global:HashForGui=[hashtable]::«»Synchronized(@{})
$global:RunSpaceForGui.SessionStateProxy.SetVariable(\"HashForGui\",$HashForGui)
$global:«»ScriptForGui=[PowerShell]::Create().AddScript(\"$global:«»ProductPath\PS\Gui.ps1\"«»)
$global:«»ScriptForGui.RunSpace=$RunSpaceForGui
$global:HandleForGui=$ScriptForGui.BeginInvoke()
}
Function StartRunSpaceForEngine {
#-Creation et démarrage d'un RunSpace pour l'Engine
#
$global:RunSpaceForEngine=[runspacefactory]::CreateRunspace()
$global:RunSpaceForEngine.Open()
$global:«»ScriptForEngine=[PowerShell]::Create().AddScript(\"$global:«»ProductPath\PS\Engine.ps1\"«»)
$global:«»ScriptForEngine.RunSpace=$RunSpaceForEngine
$global:HandleForEngine=$ScriptForEngine.BeginInvoke()
}
Function StartRunSpaceForTimer {
#-Creation et démarrage d'un RunSpace pour le Timer
#
$global:RunSpaceForTimer=[runspacefactory]::CreateRunspace()
$global:RunSpaceForTimer.Open()
$global:«»ScriptForTimer=[PowerShell]::Create().AddScript(\"$global:«»ProductPath\PS\Timer.ps1\"«»)
$global:«»ScriptForTimer.RunSpace=$RunSpaceForTimer
$global:HandleForTimer=$ScriptForTimer.BeginInvoke()
}[/code:1]
L'idée étant qu'une fois la GUI construire via le premier thread, le thread engine débute et effectue une série d'étapes constituées de scripts. Une fois qu'une étape est terminée, le thread engine en informe le thread GUI. Je dois pouvoir informer étape par étape.
Je ne suis pas sûr que dans cette construction, je puisse faire communiquer les threads entre eux. Par exemple, je ne peux pas écrire dans la console à partir du thread engine, pour dire qu'une étape s'est bien passée.
En plus je dois pouvoir le faire a chaque fin d'étape.
En vous remerciant<br><br>Message édité par: Arnaud, à: 16/06/16 11:03
J'ai besoin d'un eclaircissement sur le multithread en powershell. Je travaille sur le script d'un collègue, qui utilise la structure suivante :
-Un thread master qui ouvre les trois thread du dessous
-Un thread pour la GUI
-Un thread pour l'engine
-Un thread pour un timer
Les threads sont construit ainsi :
[code:1]Function StartRunSpaceForGui {
#-Creation et démarrage d'un RunSpace pour l'interface graphique.
$global:RunSpaceForGui=[runspacefactory]::CreateRunspace()
$global:RunSpaceForGui.ApartmentState=\"STA\"
$global:RunSpaceForGui.ThreadOptions=\"ReuseThread\"
$global:RunSpaceForGui.Open()
$global:HashForGui=[hashtable]::«»Synchronized(@{})
$global:RunSpaceForGui.SessionStateProxy.SetVariable(\"HashForGui\",$HashForGui)
$global:«»ScriptForGui=[PowerShell]::Create().AddScript(\"$global:«»ProductPath\PS\Gui.ps1\"«»)
$global:«»ScriptForGui.RunSpace=$RunSpaceForGui
$global:HandleForGui=$ScriptForGui.BeginInvoke()
}
Function StartRunSpaceForEngine {
#-Creation et démarrage d'un RunSpace pour l'Engine
#
$global:RunSpaceForEngine=[runspacefactory]::CreateRunspace()
$global:RunSpaceForEngine.Open()
$global:«»ScriptForEngine=[PowerShell]::Create().AddScript(\"$global:«»ProductPath\PS\Engine.ps1\"«»)
$global:«»ScriptForEngine.RunSpace=$RunSpaceForEngine
$global:HandleForEngine=$ScriptForEngine.BeginInvoke()
}
Function StartRunSpaceForTimer {
#-Creation et démarrage d'un RunSpace pour le Timer
#
$global:RunSpaceForTimer=[runspacefactory]::CreateRunspace()
$global:RunSpaceForTimer.Open()
$global:«»ScriptForTimer=[PowerShell]::Create().AddScript(\"$global:«»ProductPath\PS\Timer.ps1\"«»)
$global:«»ScriptForTimer.RunSpace=$RunSpaceForTimer
$global:HandleForTimer=$ScriptForTimer.BeginInvoke()
}[/code:1]
L'idée étant qu'une fois la GUI construire via le premier thread, le thread engine débute et effectue une série d'étapes constituées de scripts. Une fois qu'une étape est terminée, le thread engine en informe le thread GUI. Je dois pouvoir informer étape par étape.
Je ne suis pas sûr que dans cette construction, je puisse faire communiquer les threads entre eux. Par exemple, je ne peux pas écrire dans la console à partir du thread engine, pour dire qu'une étape s'est bien passée.
En plus je dois pouvoir le faire a chaque fin d'étape.
En vous remerciant<br><br>Message édité par: Arnaud, à: 16/06/16 11:03
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 9 ans 11 mois #21941
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Besoin d'aide sur le multithread
Regarde
les events
.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 9 ans 11 mois #21945
par Florent
Réponse de Florent sur le sujet Re:Besoin d'aide sur le multithread
Merci. En fait ce qui me pose problème, c'est que dans cette construction, on a un thread \"engine\" qui execute donc les fonctions pour valider les séquences.
Il me semble plus logique de supprimer ce thread et d'executer ces actions dans le host en gardant la partie GUI dans un thread séparé. Le timer aussi, à la rigueur. Mais là j'ai l'impression qu'il ne sert a rien d'appeler dans le thread $host un thread $engine dont la fonction se ressemble finalement.
Il me semble plus logique de supprimer ce thread et d'executer ces actions dans le host en gardant la partie GUI dans un thread séparé. Le timer aussi, à la rigueur. Mais là j'ai l'impression qu'il ne sert a rien d'appeler dans le thread $host un thread $engine dont la fonction se ressemble finalement.
Connexion ou Créer un compte pour participer à la conversation.
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 9 ans 11 mois #21948
par Florent
Réponse de Florent sur le sujet Re:Besoin d'aide sur le multithread
En fait j'ai trouvé une autre solution qui est d'utiliser une hashtable commune à mes threads. Avec une temporisation d'une seconde pour laisser le temps a la gui de bien se charger. Cela fonctionne.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.038 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Besoin d'aide sur le multithread