Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDernière intervention 9 novembre 2013
-
2 mars 2007 à 16:24
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
7 mars 2007 à 19:10
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?
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 2 mars 2007 à 18:46
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
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 5 mars 2007 à 18:00
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
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201827 2 mars 2007 à 16:41
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
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 2 mars 2007 à 18:36
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)
@+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDernière intervention 9 novembre 2013 5 mars 2007 à 10:29
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.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 5 mars 2007 à 11:54
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.
Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDernière intervention 9 novembre 2013 5 mars 2007 à 16:22
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
Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDernière intervention 9 novembre 2013 7 mars 2007 à 15:41
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.