Question Thread et ressources allouées à un seul process

Plus d'informations
il y a 13 ans 4 mois #13086 par Laurent Dardenne
Laurent Dardenne écrit:

Salut, je ne vois pas de pb de freeze avec ton code

Alors, ce qui se passe c'est que tu stoppes le thread de la fenêtre, la gestion des messages win32, dans le thread du pipeline. Il y a donc deux thread, et celui de PS semble prioritaire.
Et tu seras tjr dans un runspace qui ne peut exécuter qu'un seul pipeline.
bidouilles écrit:

il y a l’ère vraiment d'avoir un problème de gestions de ressources pour

Non, voir ce tutoriel .
Ce que je voulais dire c'est qu'il n'y pas de pb dans ce contexte, ensuite que tu souhaites avoir un autre comportement c'est autre chose.
Voir aussi ce post .

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 4 mois #13087 par Laurent Dardenne
Matthew BETTON écrit:

Pour moi c'est OK :)

+1

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 3 mois #13138 par JJ
merci on est effectivement obligé d'avoir 2 Thread:
celui de base qui gère l'affichage de l'application d'acceuil dans le host, le formumlire en d'autre termes.
et celui qui fait le traitement pour lequel on affiche un nouveau progressBar

la deuxième progress bar s'affiche maintenant car le process n'est plus occupé à 100% pour le traitement à faire (Start-Sleep pour notre exemple)

depuis PowerShell 2 cela est devenu tres simple avec les job

Par contre pour l'exemple je ne fait qu'un Start-Sleep mais si je veux accéder au formulaire (thread 1) à partir du job (thread 2) je ne vois pas comment faire à part attendre la fin du traitement en réceptionnant des données.
Auriez vous une idée svp?

voir essentiellement le code entre ####################################################

[code:1]
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname(\"System.Windows.Forms\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Drawing\"«») | Out-Null
#endregion

[System.Windows.Forms.Application]::EnableVisualStyles()
####################################################
#[System.Windows.Forms.Application]::«»DoEvents()
##################################################

$frm_Main = New-Object System.Windows.Forms.Form
$btn_Export = New-Object System.Windows.Forms.Button
$lbl_Result = New-Object System.Windows.Forms.Label
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$progressBar2 = New-Object System.Windows.Forms.ProgressBar



####################################################
$btn_Export_OnClick =
{
Write-Host 'Test-Button was clicked'
$progressBar2.Visible = $true
$lbl_Result.Text = \"Veuillez patienter...\"
#$btn_Export.Enabled = $false
$Job = Start-Job {
Start-Sleep -Milliseconds 2000
}
Register-ObjectEvent -InputObject $Job -EventName StateChanged `
-Action {
#Start-Sleep -Seconds 1
Write-Host '*Event-Action*'
$progressBar2.Visible = $false
$lbl_Result.Text = \"Ok\"
}
}
####################################################

#region Formulaire
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 435
$System_Drawing_Size.Height = 550
$frm_Main.ClientSize = $System_Drawing_Size
$frm_Main.StartPosition = \"CenterScreen\"
$frm_Main.MaximizeBox = $false;
$frm_Main.MinimizeBox = $false;
#endregion

#region ProgressBar
$progressBar1.Location = new-object System.Drawing.Point(5,15)
$progressBar1.Size = New-Object System.Drawing.Size(425,30)
$progressBar1.Name = \"progressBar1\"
$progressBar1.Style = 'Marquee'
$progressBar1.Step = 20
$progressBar1.Visible = $true
$frm_Main.Controls.Add($progressBar1)

$progressBar2.Location = new-object System.Drawing.Point(5,215)
$progressBar2.Size = New-Object System.Drawing.Size(425,30)
$progressBar2.Name = \"progressBar1\"
$progressBar2.Style = 'Marquee'
$progressBar2.Step = 20
$progressBar2.Visible = $false
$frm_Main.Controls.Add($progressBar2)
#endregion

#region Bouton - Lancement
$btn_Export.TabIndex = 16
$btn_Export.Name = 'btn_Export'
$btn_Export.Size = New-Object System.Drawing.Size(425,30)
$btn_Export.Location = New-Object System.Drawing.Point(5,515)
$btn_Export.UseVisualStyleBackColor = $True
$btn_Export.Visible = $true
$btn_Export.Text = 'Ici'
$btn_Export.add_Click($btn_Export_OnClick)
$frm_Main.Controls.Add($btn_Export)
#endregion

#region Label - Result
$lbl_Result.Font = new-object System.Drawing.Font('Verdana', 10, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::«»Point,0)
$lbl_Result.Size = New-Object System.Drawing.Size(435,35)
$lbl_Result.Location = new-object System.Drawing.Point(5,475)
$lbl_Result.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
$lbl_Result.Forecolor = [System.Drawing.Color]::Green
$lbl_Result.Name = 'lbl_Result'
$lbl_Result.Text = 'Cliquer'
$frm_Main.Controls.Add($lbl_Result)
#endregion

#Save the initial state of the form
$InitialFormWindowState = $frm_Main.WindowState

#Show the Form
#$frm_Main.ShowDialog()| Out-Null
#->
##################################################
$frm_Main.Show()

while ($frm_Main.Visible)
{
[System.Windows.Forms.Application]::«»DoEvents()
}
##################################################
[/code:1]

Message édité par: bidouilles, à: 28/11/12 10:42

Message édité par: bidouilles, à: 28/11/12 10:43<br><br>Message édité par: bidouilles, à: 28/11/12 11:20

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

Plus d'informations
il y a 13 ans 3 mois #13144 par Laurent Dardenne
bidouilles écrit:

on est effectivement obligé d'avoir 2 Thread

Juste une précision (j'aime bien la précision), 'ON' n'a aucune obligation, c'est la mécanique de Powershell qui fonctionne ainsi.
Ta formulation laisse supposer que nous avons le contrôle de ce fonctionnement, ce n'est, à mon avis pas le cas, car il faut déjà le connaitre pour pouvoir le contourner.
Et là, 'on' entre en scène. Premier acte.
bidouilles écrit:

depuis PowerShell 2 cela est devenu tres simple avec les job

J'ai comme l'impression que la suite de ton post laisse penser le contraire, mais je peux me tromper.
bidouilles écrit:

Auriez vous une idée svp?

Entracte.
Comme ça en passant, utiliser le C# :whistle:
Sinon, en trépassant, il faut injecter l'état de session du runspace du formulaire dans le runspace du job.
Le pb est que le runspace d'un PSJob est d'un accès privé, et comme tu dois le savoir, ce qui est privée ne nous regarde pas :-)

A moins d'utiliser l'objet personnalisé utilisé dans le tutoriel précédement cité

Bref, je te souhaite bon courage pour la suite.

Début du second acte.
(le souffleur : 'à toi' )

Tutoriels PowerShell

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

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