Page 1 sur 2
[R] Boucle pour redemarrage de processus simple et multiple
Posté : sam. 21 févr. 2009 18:37
par Steph
Boujour,
Voilà mon soucis, je dois lancer un processus et attendre sa sortie afin de reprendre le scripte, mais dans mon cas ce processus se ferme juste apres lancement et se relance automatiquement, hors pour autoit la premiere sortie du processus le fait executer la suite de mon scripte, je souhaiterais donc pouvoir y inclure une boucle à la suite de "Run" qui dit en gros: si le processus se ferme, le scripte attend 1/2 seconde voir moins puis si pas de processus continut le scripte et si processus à nouveau en cours se remet en attende de la fermeture du processus. Voilà, s'il vous faut d'autres renseignement n'hézitez pas, j'espere avoir été clair...
Je vous met ici mon bout de code de la partie lancement qui fonctionnerait tel quel si le logiciel en question ne demanderait pas de redemarrage ou autre. Je souhaiterais donc pouvoir inclure cette boucle à tout mes scriptes fesant appel à des logiciels utilisant des redemarrage ou autre.
Code : Tout sélectionner
#NoTrayIcon
;$APPDIR = "Chemin de mon application"
;$PROCES = "processus de l' application"
; partie du code d'avant lancement.
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
ProcessWaitClose($PROCES)
Sleep(100)
; Partie du code à executer apres la fermeture du processus.
En vous remerciant d'avance.
cdt
REEDIT, je joint une autre demande tres proche ne necessitant pas de nouveau poste, et continut donc celui-ci, voir plus-bas:
Steph a écrit :Salut,
suite à ma premiere demande j'en viens avec une autre tres proche, voilà mon code:
Code : Tout sélectionner
$PROCES = "Integrator.exe"
$APPDIR = "chemin de mon appli"
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
While 1
$P1 = "MemOptimizer.exe"
$P2 = "OneClick.exe"
$P3 = "DriveDefrag.exe"
While 1
If ProcessExists($PROCES) = 0 Then ExitLoop
ProcessWaitClose($PROCES)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P1) = 0 Then ExitLoop
ProcessWaitClose($P1)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P2) = 0 Then ExitLoop
ProcessWaitClose($P2)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P3) = 0 Then ExitLoop
ProcessWaitClose($P3)
Sleep(800) ;ou plus
WEnd
$ALLP = ProcessExists($PROCES And $P1 And $P2 And $P3)
If $ALLP = 0 Then ExitLoop
WEnd
Sleep(100)
En faite le processus principal $PROCES lance d'autres proces ($P1, $P2, $P3) et je souhaite qu'on sorte de la boucle lorsque plus aucun de ces processus ne soit actifs, mon code fonctionne mais parfois le scripte continut sans que je ne sache reelement pourquoi, et c'est pour cela que je viens chercher de l'aide à nouveau.
En vous remerciant d'avance, cdt
Stéphane
Re: [..] Boucle pour redemarrage de processus
Posté : sam. 21 févr. 2009 19:48
par Iste
Je ne suis pas bien sur, mais peut etre que avec un sleep() avant le Wait..
T'as essayé avec
Code : Tout sélectionner
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
Sleep(100) ;ou plus
ProcessWaitClose($PROCES)
Sleep(100)
?
Re: [..] Boucle pour redemarrage de processus
Posté : sam. 21 févr. 2009 20:15
par Steph
Salut,
Effectivement il y aurait la solution du sleep apres le Run pour contrer le "sursaut" eventuel du processus au lancement de l'apli mais si l'appli necessite un redemarrage (pour changer de langue par exemple) je retombe toujours sur le meme probleme, mon scipte continu et fait ses actions alors que le processus reprend... je prefererais opté pour une autre solution, sous forme de petite fonction cela serait parfait. Merci encore à toi, cordialement.
Stéf
Re: [..] Boucle pour redemarrage de processus
Posté : sam. 21 févr. 2009 21:08
par Iste
hum.. oki,
Dans ce cas, peut etre que ce code fonctionera mieux ^^
Code : Tout sélectionner
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
while 1
ProcessWaitClose($PROCES)
Sleep(500) ;ou plus
If Not ProcessExists ($PROCES) Then Exitloop
wend
Tout simple, il ne quite pas la boucle dans que le process ne reste pas fermé pendant au moins 500ms (ou plus).
Edit :
Je suis pas bien sur de mon Not ProcessExists (), le plus sur est de faire :
Re: [..] Boucle pour redemarrage de processus
Posté : sam. 21 févr. 2009 21:51
par Steph
Salut,
Merci beaucoup ! tout à fait ce que je cherchais !
par contre peut-tu juste m'expliquer (car pour moi c'est la meme chose) pourquoi la solution A est preferable à la B, voir:
A:
B:
Utilisant souvent des "Not" plutot que des "= 0" cela m'interresse au plus haut point, sinon quel serait la valeur du sleep à mettre en fonction du temps qu'un logiciel tue le processus lors d'un redemarrage ? ce temps doit etre minime mais à combien le chiffreer ? 500 est peut-etre un peut juste non ? (lol), en te remerciant d'avance pour ce que tu fait.
cdt
Stéphane
Re: [R] Boucle pour redemarrage de processus
Posté : sam. 21 févr. 2009 23:03
par Iste
Ben, les deux solution reviennent au meme, mais je suis sûr que la deuxieme solution fonctionne ^^' J'ai dis ca car je n'avais pas testé le script, histoire de pas donner un truc qui marche pas et m'en aller.
Sinon, pour le 500, ben pareil, je sais pas, alors j'ai mis un truc qui a de forte chance de marcher. Comme je ne sais pas combien de temps ton process reste éteint, j'ai préféré mettre une valeur "grande". (pis c'est toi qu'a dit :"le scripte attend 1/2 seconde" :p)
De plus, il faut prendre en compte les bug qui peuvent survenir. Si l'ordi est surchargé au moment ou le process reboot, il se peut que ca dur un certain temps.
Donc le mieux, c'est de tester toi meme sur la machine la plus lente qui va faire tourner le script, et memetre le minimum + une petite marge d'erreur
Mais l'idéal serait d'avoir un moyen plus sûr de savoir que le process a bien terminé, car la, c'est un peu du bricolage ^^'
(Si c'est une (ou plusieurs) application spécifique (donc pas le lecteur de texte par defaut, qui peut changer d'une machine a l'autre), il serait bon de voir si l'on ne peut pas récuperer un petit quelque chose que le process enverrait avant de rendre l'ame.)
Mais ca, je sais pas faire

Re: [R] Boucle pour redemarrage de processus
Posté : sam. 21 févr. 2009 23:27
par Tlem
Est-ce que
ShellExecuteWait ou
RunWait vous rendent la main lors de la première fermeture du processus ?
Edit : Sinon, ceci devrait correspondre :
Code : Tout sélectionner
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
Sleep(1000)
If ProcessExists($PROCES) Then ProcessWaitClose($PROCES)
J'ai mis une seconde d'attente au cas ou.

Re: [R] Boucle pour redemarrage de processus
Posté : dim. 22 févr. 2009 00:18
par Steph
Salut et merci à vous deux, j'ai trouver ce que je cherchais ! par contre ta soluce Tlem me conviendrait sauf lors du redemarrage necessaire au changement de langue par exemple, donc l'autre solution (avec la boucle) est la meilleure pour moi.
cdt
Stef
Re: [R] Boucle pour redemarrage de processus
Posté : dim. 22 févr. 2009 00:22
par Tlem
Cela revient au même puisque après le premier lancement du processus on attend une seconde au cas ou le processus ce relancerait puis on vérifie si il existe et en fonction, on attend qu'il s'arrête ...
Re: [R] Boucle pour redemarrage de processus
Posté : dim. 22 févr. 2009 00:30
par Iste
Oui mais, si le process se relance plusieurs fois, le script continura au second reboot du process si on utilise pas de boucle non ?
Re: [R] Boucle pour redemarrage de processus
Posté : dim. 22 févr. 2009 01:01
par Tlem
Ce cas n'à pas été précisé.
De toute façon, votre boucle fera la même chose dans ce cas là ...
Re: [R] Boucle pour redemarrage de processus
Posté : dim. 22 févr. 2009 03:18
par Steph
Iste a écrit :si le process se relance plusieurs fois, le script continura au second reboot du process si on utilise pas de boucle
Salut,
oui, c'est aussi ceci que je souhaiterais éviter ! et la boucle remplit tres bien ce rôle ! en tout cas merci à vous deux, et l'essentiel est que j'ai ma solution

.
cdt
Re: [R] Boucle pour redemarrage de processus
Posté : lun. 02 mars 2009 18:57
par Steph
Salut,
suite à ma premiere demande j'en viens avec une autre tres proche, voilà mon code:
Code : Tout sélectionner
$PROCES = "Integrator.exe"
$APPDIR = "chemin de mon appli"
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
While 1
$P1 = "MemOptimizer.exe"
$P2 = "OneClick.exe"
$P3 = "DriveDefrag.exe"
While 1
If ProcessExists($PROCES) = 0 Then ExitLoop
ProcessWaitClose($PROCES)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P1) = 0 Then ExitLoop
ProcessWaitClose($P1)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P2) = 0 Then ExitLoop
ProcessWaitClose($P2)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P3) = 0 Then ExitLoop
ProcessWaitClose($P3)
Sleep(800) ;ou plus
WEnd
$ALLP = ProcessExists($PROCES And $P1 And $P2 And $P3)
If $ALLP = 0 Then ExitLoop
WEnd
Sleep(100)
En faite le processus principal $PROCES lance d'autres proces ($P1, $P2, $P3) et je souhaite qu'on sorte de la boucle lorsque plus aucun de ces processus ne soit actifs, mon code fonctionne mais parfois le scripte continut sans que je ne sache reelement pourquoi, et c'est pour cela que je viens chercher de l'aide à nouveau.
En vous remerciant d'avance, cdt
Stéphane
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : lun. 02 mars 2009 20:57
par Iste
remplace ce code :
► Afficher le texte
Code : Tout sélectionner
While 1
If ProcessExists($P1) = 0 Then ExitLoop
ProcessWaitClose($P1)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P2) = 0 Then ExitLoop
ProcessWaitClose($P2)
Sleep(800) ;ou plus
WEnd
While 1
If ProcessExists($P3) = 0 Then ExitLoop
ProcessWaitClose($P3)
Sleep(800) ;ou plus
WEnd
par
Code : Tout sélectionner
While 1
$Etat = 0 ;on definit une variable a 0
$Etat = ProcessExists($P1) + ProcessExists($P2) + ProcessExists($P3) ; on additionne les 3 retour ProcessExists pour les 3 proces
If $Etat = 0 Then ExitLoop ;si les 3 font 0, c'est qu'ils sont tous stopé, donc on sort
If ProcessExists($P1) Then ;Sinon, on regarde si le 1 tourne,
ProcessWaitClose($P1) ;si oui, ben on attend qu'il se ferme
ElseIf ProcessExists($P2) Then ;si non, on regarde si le 2 tourne
ProcessWaitClose($P2) ;et on attend qu'il se ferme
Else ProcessExists($P3) Then ;sinon, ca veut dire que le 3 tourne
ProcessWaitClose($P3) ;donc on attend qu'il se ferme
ElseIf
Sleep (800)
WEnd
cette boucle verifit les 3 en meme temps, normalement, ca devrait marcher, meme si je comprend pas ce qui va pas avec ton code :/
edit : j"aurai pu rajouter le premier process, je sais pas pourquoi je l'ai pas fait...
Enfin, j'ai tout collé ensemble, car je me suis dis que peut etre de les verifier un a un, pouvait poser probleme si l'un des trois se terminait, puis se relancait apres les 800ms de securité
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : lun. 02 mars 2009 22:23
par Steph
Salut,
donc en gros ça donne ça: (dit moi si j'me trompe... j'ai ajouter le premier proces)
Code : Tout sélectionner
$PROCES = "Integrator.exe"
$APPDIR = "chemin de mon appli"
; Lancement et attente de fermeture.
Sleep(50)
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
$P1 = "MemOptimizer.exe"
$P2 = "OneClick.exe"
$P3 = "DriveDefrag.exe"
While 1
;on definit une variable a 0
$Etat = 0
; on additionne les 4 retour ProcessExists pour les 4 proces
$Etat = ProcessExists($PROCES) + ProcessExists($P1) + ProcessExists($P2) + ProcessExists($P3)
;si les 4 font 0, c'est qu'ils sont tous stopé, donc on sort.
If $Etat = 0 Then ExitLoop
If ProcessExists($PROCES) Then ;Sinon, on regarde si le 1 tourne,
ProcessWaitClose($PROCES) ;si oui, ben on attend qu'il se ferme
ElseIf ProcessExists($P1) Then ;Si non, on regarde si le 2 tourne,
ProcessWaitClose($P1) ;si oui, ben on attend qu'il se ferme
ElseIf ProcessExists($P2) Then ;si non, on regarde si le 3 tourne
ProcessWaitClose($P2) ;et on attend qu'il se ferme
Else ProcessExists($P3) Then ;sinon, ca veut dire que le 4 tourne
ProcessWaitClose($P3) ;donc on attend qu'il se ferme
EndIf
Sleep(800)
WEnd
Sleep(100)
; Action apres fermeture.
J'ai testé mais ça me dit erreur de syntax 
! serais-tu ou ça coince ? sinon juste une question car je n'ai pas vu d'exemple dans l'aide, à t'on le droit de mettre plusieurs ElseIf à la suite comme ici ? soit comme:
Code : Tout sélectionner
If .... Then
ElseIf ...
ElseIf ...
ElseIf ...
ElseIf ...
ElseIf ...
Else
EndIf
Merci d'avance.
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : lun. 02 mars 2009 22:37
par Iste
Ben, a premiere vu oui c'est bien ca le code ^^ (maisje suis pas a l'abrit d'une erreur)
Sinon, tu peux mettre autant de elseIf que tu veux (a ma connaisance)
Mais dans les exemples, en general, dès qu'il y en a un peu trop, ils remplacent par un Select ou un Switch.
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : lun. 02 mars 2009 23:01
par Steph
Iste a écrit :Ben, a premiere vu oui c'est bien ca le code ^^ (maisje suis pas a l'abrit d'une erreur)
Sinon, tu peux mettre autant de elseIf que tu veux (a ma connaisance)
Mais dans les exemples, en general, dès qu'il y en a un peu trop, ils remplacent par un Select ou un Switch.
Salut,
apparemment la syntax n'est pas bonne, rien à faire, voir:
Si tu peut voir de ton coté pourquoi ça coince car perso je vois pas...
cdt
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : mar. 03 mars 2009 00:26
par Iste
bon ben, pas plus d'un elseif on dirait ^^' désolé, et merci pour l'info !
Code : Tout sélectionner
$PROCES = "Integrator.exe"
$APPDIR = "chemin de mon appli"
; Lancement et attente de fermeture.
Sleep(50)
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
$P1 = "MemOptimizer.exe"
$P2 = "OneClick.exe"
$P3 = "DriveDefrag.exe"
While 1
;on definit une variable a 0
$Etat = 0
; on additionne les 4 retour ProcessExists pour les 4 proces
$Etat = ProcessExists($PROCES) + ProcessExists($P1) + ProcessExists($P2) + ProcessExists($P3)
;si les 4 font 0, c'est qu'ils sont tous stopé, donc on sort.
If $Etat = 0 Then ExitLoop
Select
Case ProcessExists($PROCES)
ProcessWaitClose($PROCES)
Case ProcessExists($P1)
ProcessWaitClose($P1)
Case ProcessExists($P2)
ProcessWaitClose($P2)
Case ProcessExists($P3)
ProcessWaitClose($P3)
EndSelect
Sleep(800)
WEnd
Sleep(100)
; Action apres fermeture.
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : mar. 03 mars 2009 07:49
par Tlem
Oui, il est possible de chaîner les
ElseIf, mais la syntaxe serait plutôt :
Code : Tout sélectionner
If .... Then
ElseIf ... Then
ElseIf ... Then
ElseIf ... Then
ElseIf ... Then
ElseIf ... Then
Else
EndIf
Par contre aux vues de votre code, je vous conseil plutôt l'utilisation d'une condition
Case au lieu du
ElseIf.
Code : Tout sélectionner
Select
Case <expression>
statement1
...
[Case
statement2
...]
[Case Else
statementN
...]
EndSelect
Re: [..] Boucle pour redemarrage de processus simple et multiple
Posté : mar. 03 mars 2009 08:51
par Steph
Salut et merci !
En effet la syntax n'etait pas respecté au niveau du Else, sinon pourriez vous juste m'expliquer plus en detail la partie entre select et endselect
(l'aide: http://www.autoitscript.fr/autoit3/docs ... tional.htm ne dit pas pourquoi cela est préférable), il est dit pour un grand nombre de conditions mais j'ai testé avec une vingtaine de processus dans le code (pour testé) et le scripte bloque comme avec des ElseIf, est-ce normal ? faut-il plutot utiliser un switch alors ? ,avec 4 ou meme 8 proc ça marche à merveille,
(meme avec des ElseIf), sinon voilà mon code final et fonctionnel:
Code : Tout sélectionner
Run($APPDIR & $PROCES)
ProcessSetPriority($PROCES, 4)
While 1
; on definit une variable a 0.
$Etat = 0
; on additionne les 8 retour ProcessExists pour les 8 proces.
$Etat = ProcessExists($PROCES) + ProcessExists("DriveDefrag.exe") + ProcessExists("MemOptimizer.exe") + ProcessExists("OneClick.exe") + ProcessExists("RegistryCleaner.exe") + ProcessExists("RegistryDefrag.exe") + ProcessExists("RescueCenter.exe") + ProcessExists("WinStyler.exe")
; si les 8 font 0, c'est qu'ils sont tous stopé, donc on sort.
If $Etat = 0 Then ExitLoop
Select
Case ProcessExists($PROCES)
ProcessWaitClose($PROCES)
Case ProcessExists("DriveDefrag.exe")
ProcessWaitClose("DriveDefrag.exe")
Case ProcessExists("MemOptimizer.exe")
ProcessWaitClose("MemOptimizer.exe")
Case ProcessExists("OneClick.exe")
ProcessWaitClose("OneClick.exe")
Case ProcessExists("RegistryCleaner.exe")
ProcessWaitClose("RegistryCleaner.exe")
Case ProcessExists("RegistryDefrag.exe")
ProcessWaitClose("RegistryDefrag.exe")
Case ProcessExists("RescueCenter.exe")
ProcessWaitClose("RescueCenter.exe")
Case ProcessExists("WinStyler.exe")
ProcessWaitClose("WinStyler.exe")
EndSelect
Sleep(800)
WEnd
Sleep(100)
Par avance merci pour tout !
cdt