Select Case et contrôle processus qui marche pas... [Résolu]

Signaler
Messages postés
148
Date d'inscription
lundi 12 février 2007
Statut
Membre
Dernière intervention
9 novembre 2013
-
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
EDIT: je reposte ici ce sujet car je m'étais trompé de section, c'est un code en VB6 et pas 5. Messieurs les admins, désolé...

Bonjour à tous,

Moi
je suis débutant, mais ce code ne me semble pas être de mon niveau, la preuve en est que je suis largué. Voilà le problème, je
veux lancer plusieurs scripts à la suite et lancer le suivant quand le
précédent se termine. Pour ça , j'ai trouvé un bout de code qui utilise
le wmi et qui me refile la liste des processus lancés. Je prends donc
cette liste et en fonction d'elle, je coordonne le lancement de mes
scripts.

Vu que les opérations a réaliser sont nombreuses et
très conditionnées, j'ai utilisé un select case. Alors voilà le bout de
code mais je précise quelques petites choses avant:
- etape = 1 (déclaré dans le sub d'avant)
- Pour la variable continue voir à la fin- Une petite question: If element.Name "VirtualDub.exe" Null peut-il vouloir dire "si je ne trouve pas virtualdub.exe dans la liste des processus?"
-
Une autre question: Là en principe, le timer fait qu'il y a une boucle
jusqu'à ce que l'étape 5 soit atteinte, et que continue = 0, je me
trompe?
- Je me suis aperçu que le problème de ce code est au niveau de :
(Set liste = GetObject("winmgmts:").InstancesOf("Win32_Process") 'Récupération des processus en cours d'exécution) car je reste bloqué à case1 (il ne trouve pas Virtualdub.exe, j'ai essayé avec explorer.exe, et ça marche pas non plus. J'avais biensûr ce processus qui tournait..)
A titre d'info et pour rendre à césar ce qui est à césar, j'ai chopé
cette ligne là http://www.vbfrance.com/code.aspx?ID=1311 . A la ligne
285. J'ai déclaré les variables nécessaires. Vous connaissez une solution de rechange?

Le code

Private Sub Timer()
  Timer1.Interval = 1000
'Attendre la fin de VirtualDub
    Set liste = GetObject("winmgmts:").InstancesOf("Win32_Process") 'Récupération des processus en cours d'exécution
   
    For Each element In liste
       
        Select Case etape
        Case 1 'j'attends que virtualdub se lance
            If element.Name = "VirtualDub.exe" Then
                etape = 2
            End If

        Case 2 'virtualdub lancé, j'attends qu'il s'arrête            If element.Name "VirtualDub.exe" Null Then
                etape = 3
                Shape2.Visible = True
            End If

        Case 3 'Virtualdub arrété, on passe à la suite
              Call execution
              MsgBox "QT", vbOKOnly
              etape = 4
              Shape3.Visible = True

        Case 4 ' j'attends que QTscript s'arrête            If element.Name "QTscript.exe" Null Then
              etape = 5
            End If

        Case 5 'QTscript terminé, on passe à la suite (continue = 0 dc la boucle du timer s'arrête)
                Call DVCscript
                Shape4.Visible = True
                Patientez.Caption = "Patientez"
                Patientez.Enabled = False
                continue = 0
 
  End Select
   Next
 
    If continue = 1 Then
        Timer1.Interval = 1000
    Else:
  
        Timer1.Interval = 0
    End If
End Sub

Pouvez vous m'aider à purger ce code des éventuelles erreurs svp? Un ptit coup de main svp?

13 réponses

Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
1
Salut

Euh la ligne :If element.Name "VirtualDub.exe" Null Then

Je ne pense pas qu'elle fasse ce que tu veux. Tu veux tester si VirtualDub est fermé ?
Alors il faut parcourir la liste avec For Each element In liste ... Next en cherchant si il y a un element qui s'appelle VirtualDub.exe
En gros :

Private Sub Timer()
    dim IsVirtualDubPresent  as boolean
  Timer1.Interval = 1000
'Attendre la fin de VirtualDub
    Set liste = GetObject("winmgmts:").InstancesOf("Win32_Process") 'Récupération des processus en cours d'exécution
   
    IsVirtualDubPresent = False
    IsQTscript = false

    For Each element In liste
       
            If element.Name = "VirtualDub.exe" Then
                IsVirtualDubPresent = true
            End If


            If element.Name = "QTscript.exe" Then

                IsQTscript = true


            End If
 
   Next

Select Case etape
    Case 1 'j'attends que virtualdub se lance


        If IsVirtualDubPresent =True then

            etape = 2

        end if

    Case 2
        ' Si on a pas trouvé VirtualDub
        If IsVirtualDubPresent =False then
            etape = 3

            Shape2.Visible = True
        end if


        Case 3 'Virtualdub arrété, on passe à la suite

              Call execution

              MsgBox "QT", vbOKOnly

              etape = 4

              Shape3.Visible = True


        Case 4 ' j'attends que QTscript s'arrête

            If IsQTscript =False then

              etape = 5

            End If


        Case 5 'QTscript terminé, on passe à la suite (continue = 0 dc la boucle du timer s'arrête)

                Call DVCscript

                Shape4.Visible = True

                Patientez.Caption = "Patientez"

                Patientez.Enabled = False

                continue = 0

  End Select
 
    If continue = 1 Then
        Timer1.Interval = 1000
    Else
        Timer1.Interval = 0
    End If

End Sub

J'ai mis le SelectCase en dehors du For Net pour pas qu'il soit executé 50 fois à la suite
Teste le et dis moi si ça a amélioré, si il y a des problèmes

- MadMatt -
Vb System Library
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Tiens, c'est Noël ;)
Tu copies tout çà, tu le colles dans le fichier form1.frm de mon exemple (tu ouvres avec notepad et tu remplaces l'ancien contenu).





VERSION 5#
Begin VB.Form Form1
  AutoRedraw = -1         'True
  Caption = "Test"
  ClientHeight = 2985
  ClientLeft = 60
  ClientTop = 375
  ClientWidth = 5715
  BeginProperty Font
     Name = "Tahoma"
     Size = 8.25
     Charset = 0
     Weight = 400
     Underline = 0           'False
     Italic = 0              'False
     Strikethrough = 0       'False
  EndProperty
  LinkTopic = "Form1"
  ScaleHeight = 2985
  ScaleWidth = 5715
  StartUpPosition = 3    'Windows Default
  Begin VB.CommandButton cmdLaunch
     Caption = "Démarrer le timer"
     Height = 615
     Left = 2160
     TabIndex = 0
     Top = 840
     Width = 2535
  End
  Begin VB.Timer Timer1
     Enabled = 0             'False
     Interval = 1000
     Left = 240
     Top = 1200
  End
  Begin VB.Label Patientez
     Caption = "Label ""patientez"""
     Height = 255
     Left = 120
     TabIndex = 1
     Top = 240
     Width = 3015
  End
  Begin VB.Shape Shape4
     Height = 615
     Left = 480
     Shape = 2              'Oval
     Top = 2040
     Visible = 0             'False
     Width = 855
  End
  Begin VB.Shape Shape3
     Height = 855
     Left = 3840
     Shape = 2              'Oval
     Top = 2040
     Visible = 0             'False
     Width = 1335
  End
  Begin VB.Shape Shape2
     Height = 495
     Left = 1920
     Shape = 2              'Oval
     Top = 2160
     Visible = 0             'False
     Width = 1575
  End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'-------------------------------------------------------
'//FORM DE TEST
'-------------------------------------------------------

Option Explicit

Private MaClasse As clsProcess  'voila la classe qui sera utilisée partout
Private vdIsOk As Boolean
Private qtIsOk As Boolean
Private etape As Long

Private Sub cmdLaunch_Click()
'lance le timer
   Timer1.Enabled = True
End Sub

Private Sub Form_Load()
   Set MaClasse = New clsProcess   'instancie la classe
   vdIsOk = False
   qtIsOk = False
   etape = 1
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Set MaClasse = Nothing  'libère la classe
End Sub

Private Sub Timer1_Timer()
'sub exécutée toutes les 2secondes environ
Dim p() As ProcessItem  'tableau contenant la liste des processus
Dim x As Long
Dim IsVirtualDubPresent  As Boolean
Dim IsQTscript As Boolean

   
   MaClasse.EnumerateProcesses p() 'récupère la liste des processus et la stocke dans
   'le tableau dynamique p()
   
   'par défaut, les processus sont absents
   IsVirtualDubPresent = False
   IsQTscript = False
   
   'parcours chaque élément du tableau (MaClasse.ProcessNumber renvoyant le nombre de processus)
   For x = 0 To MaClasse.ProcessNumber - 1
       'si le processus numéro x . son nom (en minuscules) = "virtualdub.exe"
       If LCase$(p(x).szExeFile) = "virtualdub.exe" Then
           IsVirtualDubPresent = True
           vdIsOk = True
       End If
       
       'si le processus numéro x . son nom (en minuscules) = "qtscript.exe"
       If LCase$(p(x).szExeFile) = "qtscript.exe" Then
           IsQTscript = True
           qtIsOk = True
       End If
   
   Next x

   'maintenant, autre chose de plus propre que ton select case :
   If etape = 1 Then       If IsVirtualDubPresent True Then etape 2
   End If
   If etape = 2 Then
       If vdIsOk = False Then
           'étape 3
           Shape2.Visible = True
           etape = 3
       End If
   End If
   If etape = 3 Then
       Call scriptQT
       MsgBox "QT", vbOKOnly
       Shape3.Visible = True
       etape = 4
   End If
   If etape = 4 Then
       If qtIsOk = False Then
         etape = 5
       End If
   End If
   If etape = 5 Then
       Call DVCscript
       Shape4.Visible = True
       Patientez.Caption = "Patientez"
       Patientez.Enabled = False
       
       'le timer ne sera désormais plus actif
       Timer1.Enabled = False
   End If
           
           
              If IsVirtualDubPresent False Then vdIsOk False   If IsQTscript False Then qtIsOk False
           

End Sub

Private Sub scriptQT()
   MsgBox "scriptQT"   'signifie que l'on est bien rentré dans cette sub
End Sub

Private Sub DVCscript()
   MsgBox "DVCscript"  'signifie que l'on est bien rentré dans cette sub
End Sub




By Renfield





@+
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour à tous

réponse en vbs mais devrait être ok aussi en vb6.

For Each Process In GetObject("winmgmts:").InstancesOf("Win32_process" )
    If Process.Name = "OUTLOOK.EXE" Then MsgBox "Le process " & Process.Name & " est actif.....numéro ID: " & Process.ProcessID
Next

jean-marc
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Salut, alors1) If element.Name "VirtualDub.exe" Null est peu explicite, donc à ne pas utiliser (rend la relecture difficile).
2) récupérer les processus par WMI marche, mais WMI est lent et nécessite d'être activé. Donc le mieux est de passer par les APIs : voici un exemple (c'est une classe avec d'autres fonctions, mais tu as le listing des processus en exemple) http://www.vbfrance.com/codes/CLASSE-SUR-PROCESSUS-LEURS-MODLES-PERMET-AVOIR-INFOS_40274.aspx3) c'est pas une très bonne idée de faire le listing de tous les process avec un timer de 1000 (bouffe trop de ressources)

@+
Messages postés
148
Date d'inscription
lundi 12 février 2007
Statut
Membre
Dernière intervention
9 novembre 2013

Merci pour vos réponse! Je regarde ça lundi et je vous dis ce qu'il en est En tout cas ça risque de faire avancer ce problème.!
Messages postés
148
Date d'inscription
lundi 12 février 2007
Statut
Membre
Dernière intervention
9 novembre 2013

Bonjour à tous,

J'ai retravaillé le code de la façon dont [auteurdetail.aspx?ID=191911 MadM@tt] me l'a conseillé. Je pense que ce code est fonctionnel mais ça ne marche pas.  Lorsque je l'execute "pas à pas" (f8) la variable IsVirtualDubPresent reste fausse en dépit du fait que virtualdub tourne et qu'il y ait le process virtualdub.exe qui tourne. J'en conclus donc que la commande pour lister les process ne marche pas et ça me conduit à cette question: le WMI est il bien activé? Je suis sous windows 2k (je crois qu'il y est activé par défaut) et j'ai mis en référence Microsoft WMI scripting v1.1 library. Quelque chose d'autre à faire? Une idée pour activer le WMI ou corriger la commande de listage des process? (si elle est fausse).

Pour le next et le select case, je ne sais pas si c'est lié au bug précédent mais si je laisse le select case en dehors du for.. Next, il tourne en boucle et ne passe pas aux case 1,2,3,4... J'ai donc laissé les select case dans la boucle for next, mais j'ai peut-être tort.

Merci!
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Salut, relis mon message et trouve une autre méthode pour lister tes processus (en l'occurence les APIs, exemple donné dans la source citée). Rien de bien complexe, mais beaucoup plus performant et marche à tous les coups.

Et n'oublies pas de faire Lcase$() ou Ucase()$  pour convertir le nom des process et du process recherché pour éviter les erreurs du genre "svchost.exe"<>"SVCHOST.EXE".

Le select case est indépendant du For..Next (etape n'étant pas modifie dans cette boucle). Donc il FAUT le sortir.

@+
Messages postés
148
Date d'inscription
lundi 12 février 2007
Statut
Membre
Dernière intervention
9 novembre 2013

Salut Violent Ken,

J'avais commencé avec ton code il y a deux semaines mais j'étais alors complètement ignare en programmation VB. J'avais donc abandonné. Vu que j'ai des problèmes de dll avec le WMI (selon outil de diagnostic MS), j'ai retenté aujourd'hui ta méthode mais je ne suis pas beaucoup plus costaud donc je ne sais pas si je m'y prends bien. Alors j'ai chargé les quatre modules de classe et j'ai changé le code comme ci-dessous.

Lorsque j'execute le code, erreur 438, l'objet ne gère pas cette propriété ou cette méthode et la ligne
 >If element.Name = "VirtualDub.exe" Then< est soulignée. Sais tu comment adapter mon code pour qu'il fonctionne avec ta liste de process?

En début de code:

Option Explicit
Private MaClasse As clsProcess

Et le sub Timer:
Private Sub Timer()
    
    Dim p() As ProcessItem
    Dim IsVirtualDubPresent  As Boolean
    Dim IsQTscript As Boolean
    Dim element
    Set MaClasse = New clsProcess
     
Timer1.Interval = 1000
 
    IsVirtualDubPresent = False
    IsQTscript = False

    MaClasse.EnumerateProcesses p() 'récupère la liste des processus
    
    For Each element In p
       
            If element.Name = "VirtualDub.exe" Then
                IsVirtualDubPresent = True
            End If
            If element.Name = "QTscript.exe" Then
                IsQTscript = True
            End If
 
  Next

Select Case etape
    Case 1 'j'attends que virtualdub se lance
        If IsVirtualDubPresent = True Then
            etape = 2
        End If

    Case 2
        ' Si on a pas trouvé VirtualDub
        If IsVirtualDubPresent = False Then
            etape = 3
            Shape2.Visible = True
        End If

        Case 3 'Virtualdub arrété, on passe à la suite
              Call scriptQT
              MsgBox "QT", vbOKOnly
              etape = 4
              Shape3.Visible = True

        Case 4 ' j'attends que QTscript s'arrête
            If IsQTscript = False Then
              etape = 5
            End If

        Case 5 'QTscript terminé, on passe à la suite (continue = 0 dc la boucle du timer s'arrête)
                Call DVCscript
                Shape4.Visible = True
                Patientez.Caption = "Patientez"
                Patientez.Enabled = False
                continue = 0
  End Select
 
    If continue = 1 Then
        Timer1.Interval = 1000
    Else
        Timer1.Interval = 0
    End If

End Sub

Alors, une idée?
Messages postés
148
Date d'inscription
lundi 12 février 2007
Statut
Membre
Dernière intervention
9 novembre 2013

Merci Violent Ken !! Tu sais, je n'en demandais pas tant mais je ne vais pas m'en plaindre non plus!

Je ne pourrais pas tester ça avant mercredi et je suis désolé de ne pas pouvoir te donner de retour plus tôt mais je n'y manquerais pas.

Violent Ken, +1

Merci
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

De rien ;) Tu me diras si çà marche.

Par contre, j'ai bien compris ce que tu voulais faire et il me semble qu'il manque l'étape qui teste que "qtscript.exe" = True. Enfin, je crois.

@+
Messages postés
148
Date d'inscription
lundi 12 février 2007
Statut
Membre
Dernière intervention
9 novembre 2013

Bonjour!

Alors j'ai testé ça et ça fonctionne à merveille. A la base, vu que tu m'avais dis que le Timer était d'environ 2secondes, je l'ai réglé à 2 mais en relisant les données de ta Form1, j'ai vu que c'était 1s, j'ai changé, et ça roule! Pour QTscript.exe = true, si le but est de tester  si qtscript tourne encore, ce n'est pas nécessaire vu que les tâches de QTscript sont très rapidement expédiées. Cela dit, pour faire les chose proprement, pourquoi pas.

Merci bien en tout cas Violent Ken!

Je t'en dois une ;)

Et merci à tous les autres, notament MadM@t qui m'ont aussi bien aidé à avancer sur le sujet.
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Mais de rien ;) Content pour toit que çà marche ^^

@+
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

*pour toi

(désolé pour le double post)

@+ ^^