none
[PowerShell] PB ressources CPU allouées à un seul process et utilisation de thread RRS feed

  • Question

  • Bonjour, J’ai ce qui semble un bug de Windows PowerShell que je ne retrouve pas avec les éditeurs de PowerShell comme Windows PowerShell ISE et n’arrive pas à le contourner, pourriez-vous m’aider s’il vous plait.

    Au clic sur un bouton, si je lance une fonction comme « Start-Sleep -Milliseconds 5000 » ou autre

    Apres avoir voulu afficher une progressBar comme suit

    [code]

            $progressBar2.Visible = $true

            $lbl_Result.Text = "Veuillez patienter..."

           $btn_Export.Enabled = $false

            Start-Sleep -Milliseconds 5000

    [/code]

    Le bouton se grise bien et le progressBar2 s’affiche bien mais l’appel après à une fonction comme Start-Sleep fige tous les progressBar le temps que cette fonction n’a pas finie d’être traité

    Es-ce parce que les progressBar n’ont pas assez de ressources CPU allouées ?

    Suis-je obligé de lancer la fonction dans un thread à part, si oui auriez-vous un exemple quelque part ?

    Voir le code complet ci dessous

    [code]

        #region Import the Assemblies

        [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null

        [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null

       

        $frm_Main = New-Object System.Windows.Forms.Form

        $btn_Export = New-Object System.Windows.Forms.Button

        $lbl_Result = New-Object System.Windows.Forms.Label

         

        $btn_Export_OnClick= 

        {

            $lbl_Result.Text = "Génération du fichier XLS en cours. Veuillez patienter..."

                                   $btn_Export.Enabled = $false

            Start-Sleep -Milliseconds 5000

            $frm_Main.Close()

              

        }     

     

        #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 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 = 'Lancer la génération du XLS'

        $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 = 'Lancer la génération du XLS'    

        $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

    [/code]

     

    Merci d'avance

    • Déplacé Aurel Bera jeudi 15 novembre 2012 13:50 (Origine :Développement .NET (en général))
    mercredi 14 novembre 2012 13:37

Réponses

Toutes les réponses

  • Bonjour

    Merci d’avoir contacté les forums MSDN. J’ai déplacé votre thread vers le forum dédiée Power Shell, ou vous avez plus de chance de trouver une réponse.

    Cordialement, 


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 15 novembre 2012 13:52
  • Un début de réponse.

    Beatus, qui prodest, quibus potest.

    mardi 20 novembre 2012 14:19
    Modérateur
  • comme je le sentais cela est bien un problème de gestion des resources, on est 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]
       #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]

                                             
    • Modifié bidouilles mercredi 28 novembre 2012 09:44
    mercredi 28 novembre 2012 09:35