Arrêter une boucle causé par une ListBox [Résolu]

Signaler
-
 Utilisateur anonyme -
Bonjour à tous,

J'ai un petit problème que j'arrive pas à résoudre. J'ai une ListBox dans laquelle va s'afficher un résultat (si le programme est bien installé ou non) au fur et à mesure qu'une instruction pour un programme précis sera terminé.

Mais lorsque je choisis d'installer 2 programmes, les instructions vont s'effectuer. Cependant à la fin de celles-ci, le code devrait s'arrêter là pour afficher définitivement la ListBox avec les résultats, mais non! Et là on est repartit pour un tour, parce qu'au final les 2 programmes comptent en réalité pour 2 tours de manège. Le problème sera le même si je choisis 10 programmes, il va me faire 10 tours de toutes les instructions au total, et me réinstaller à chaque tour les programmes précédemment installés... Je ne sais pas comment arrêter cette boucle. Exit Sub ne marche pas, et ce problème ne se produit pas lorsque je met une TextBox ( TextBox qui m'affiche qu'un résultat: celui de la dernière instruction... ).

Merci d'avance si y'a bien quelqu'un qui accepte de m'aider.

Extrait du code:
'------------------------ CODE DE LA FORM_RESULTATS:----------------------------
Public Class Resultat
    Dim appliInstalle As Boolean = True
    Dim appliEXEPresente As Boolean = True
    Dim appliMSIPresente As Boolean = True

    Private Sub Resultat_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, MyBase.VisibleChanged

'PAINT NET
        Try
            'Si le fichier est présent dans le dossier temporaire, alors
            If File.Exists("C:\WINDOWS\Temp\PACKSOFT\paintnet.exe") Then
                appliEXEPresente = True
                'commence la procédure d'installation
                If appliEXEPresente = True Then
                    '/!\ Il faut donner le chemin absolut, sinon il ne trouve pas le fichier!
                    Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\paintnet.exe", "/ auto  / CheckForUpdates = 0  DESKTOPSHORTCUT = 1 "))
                    'si c'est un succès, alors ajoute dans la textbox
                    Me.ListBox_Resultat.Items.Add("V paintnet.exe")
                Else
                    Exit Try
                End If
                'si ça passe par là, alors pas d'erreurs, Process.Start est réussit
                appliInstalle = True
            End If
            'sinon, si c'est un échec ou une erreur, alors ajoute dans la textbox
        Catch erreur As Exception
            MessageBox.Show("Install échouée. " & erreur.GetBaseException.Message)
            Me.ListBox_Resultat.Items.Add("X paintnet.exe")
        End Try

'SHOCK WARE
        Try
            'Si le fichier est présent dans le dossier temporaire, alors
            If File.Exists("C:\WINDOWS\Temp\PACKSOFT\shockware.exe") Then
                appliEXEPresente = True
                'commence la procédure d'installation
                If appliEXEPresente = True Then
                    '/!\ Il faut donner le chemin absolut, sinon il ne trouve pas le fichier!
                    Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\shockware.exe", "/S"))
                    'si c'est un succès, alors ajoute dans la textbox
                    Me.ListBox_Resultat.Items.Add("V shockware.exe")
                Else
                    Exit Try
                End If
                'si ça passe par là, alors pas d'erreurs, Process.Start est réussit
                appliInstalle = True
            End If
            'sinon, si c'est un échec ou une erreur, alors ajoute dans la textbox
        Catch erreur As Exception
            MessageBox.Show("Install échouée. " & erreur.GetBaseException.Message)
            Me.ListBox_Resultat.Items.Add("X shockware.exe")
        End Try

'SILVERLIGHT
        Try
            'Si le fichier est présent dans le dossier temporaire, alors
            If File.Exists("C:\WINDOWS\Temp\PACKSOFT\silverlight.exe") Then
                appliEXEPresente = True
                'commence la procédure d'installation
                If appliEXEPresente = True Then
                    '/!\ Il faut donner le chemin absolut, sinon il ne trouve pas le fichier!
                    Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\silverlight.exe", "/q"))
                    'si c'est un succès, alors ajoute dans la textbox
                    Me.ListBox_Resultat.Items.Add("V silverlight.exe")
                Else
                    Exit Try
                End If
                'si ça passe par là, alors pas d'erreurs, Process.Start est réussit
                appliInstalle = True
            End If
            'sinon, si c'est un échec ou une erreur, alors ajoute dans la textbox
        Catch erreur As Exception
            MessageBox.Show("Install échouée. " & erreur.GetBaseException.Message)
            Me.ListBox_Resultat.Items.Add("X silverlight.exe")
        End Try
End Sub
End Class



' --------------- APPEL DE LA FORM_RESULTAT POUR L'AFFICHAGE:--------------------
Private Sub btn_Installer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Installer.Click
        Resultat.Show()

        'Dim ViderDossier As String = "C:\WINDOWS\Temp\PACKSOFT"
        'If System.IO.Directory.Exists(ViderDossier) Then

        '    For Each files As String In My.Computer.FileSystem.GetFiles(ViderDossier)
        '        My.Computer.FileSystem.DeleteFile(files)
        '    Next

        '    'System.IO.Directory.Delete(ViderDossier)
        'End If
        
    End Sub

14 réponses

Je crois bien avoir la solution!

J'ai utilisé à méthode Process.WaitForExit() comme ceci:
Dim install As Process

install Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\paintnet.exe", "/ auto  / CheckForUpdates 0  DESKTOPSHORTCUT = 1 "))
install.WaitForExit()


Cela permet d'attendre la fin du processus avant de passer à d'autres instructions. Comme ça, l'ordre dans lequel les choses doivent se dérouler est respecté.
Il y a des commentaires que je n'ai pas changés. N'en tenez pas compte
J'ai trouvé pourquoi ça bouclait: j'avais activé VisibleChanged sur la Form_Resultat.
Donc je l'ai enlevé.

Mais maintenant l'installation d'un programme est à peine finit qu'on passe directement à la suite des évènements, ce qui fait qu'il y a des confusions et une erreur qui survient à cette ligne:
My.Computer.FileSystem.DeleteFile(files)
:
L'exception UnauthorizedAccessException n'a pas été gérée. L'accès au chemin d'accès 'C:\WINDOWS\Temp\PACKSOFT\paintnet.exe' est refusé.


normale car Paint.NET est à peine finit d'être installé que faudrait déjà supprimer son fichier d'exécution...

(J'ai enlevé les commentaires autour de la suppression des fichiers.)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
230
Bonjour,
Je ne comprends pas trop, mais devine qu'il te suffirait d'utiliser une variable booléenne par programme à installer.
Chacune de ces variables, false au départ, pourrait être mise à True si fichier installé. Il te suffirait alors de dire que tu n'installes un fichier que si la variable lui correspondant est encore à False.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
230
Je ne comprends d'ailleurs pas pourquoi tu mets dans une seule procédure l'installation, les uns à la suite des autres, de tes fichiers.
Il te suffirait d'utiliser une seule procédure paramétrée, à laquelle tu passerais en paramètre le fichier à installé (les fichiers à installer étant dans une liste à parcourir pour installer, l'un après l'autre, chacun de ces fichiers !)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
je vais le faire, je te redis ça après.
pour ce qui est de ton deuxième post, j'y avais bien pensé, mais je savais pas trop comment m'y prendre, et manque de temps, j'ai voulu aller vers la solution qui me semblait la plus "facile" on va dire (solution hyper longue surtout, mais bon...)
J'avais pensé aussi à WaitForExit() mais le problème est que s'il y a un des programmes qui ne peut pas être installé pour X raisons, je dois passer à l'installation suivante malgré tout.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
230
j'ai voulu aller vers la solution qui me semblait la plus "facile"

erreur habituelle et non justifiée. jer ne vois pas où est la difficulté à passer un paramètre à une procédure !
Il y a un paradoxe assez évident entre avoir envie de distribuer une appli et ne pas maîtriser cet aspect ultra-simple ! Le seconde proposition de cette dernière phrase mettrait en doute la justification de la première !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Chacune de ces variables, false au départ, pourrait être mise à True si fichier installé.
Comment savoir si Process.Start est finit (installation réussit ou non)?

En gros, faudrait que je donne ça comme instruction:
Si le fichier existe dans le dossier,
Alors lance process.Start
Tant que process.Start est en cours,
La variable booléenne reste à false.
Si process.Start a finit ou est interrompu,
Alors la variable booléenne passe à true.

C'est le moyen de savoir si Process.Start est en cours ou non, qui me manque.
Et de dire aussi passe à la suite si c'est true... J'ai jamais été douée avec les manipulations de booléen.

Je continue à chercher.
Elle remet entièrement en doute oui, je sais très bien que c'est pas efficace...

Bonjour,

Petite remarque :
Tu peux aussi abonner ton processus externe à l'événement Exited comme démontré dans ce sujet.
Oui, également. J'ai hésité avec cette évènement.

J'ai hésité avec cette évènement.

C'est dommage, ça t'aurait évité un 'gel' de ton thread principal pendant ton WaitForExit() en facilitant la gestion de lancement de tes setup (if/eleif...) inutiles.