[R] Boucle pour redemarrage de processus simple et multiple

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

[R] Boucle pour redemarrage de processus simple et multiple

#1

Message 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
Modifié en dernier par Steph le mar. 10 mars 2009 06:41, modifié 3 fois.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus

#2

Message 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)
?
Signez ici
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus

#3

Message 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
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus

#4

Message 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 :

Code : Tout sélectionner

If ProcessExists ($PROCES) = 0 Then Exitloop
Signez ici
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus

#5

Message 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:

Code : Tout sélectionner

If ProcessExists($PROCES) = 0 Then Exitloop
B:

Code : Tout sélectionner

If Not ProcessExists($PROCES) Then Exitloop
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
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#6

Message 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 :(
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11816
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#7

Message 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. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#8

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11816
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#9

Message 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 ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#10

Message 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 ?
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11816
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#11

Message par Tlem »

Ce cas n'à pas été précisé.
De toute façon, votre boucle fera la même chose dans ce cas là ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#12

Message 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 :D .

cdt
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [R] Boucle pour redemarrage de processus

#13

Message 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
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#14

Message par Iste »

remplace ce code :
► Afficher le texte
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é
Signez ici
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#15

Message 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.
Modifié en dernier par Steph le lun. 02 mars 2009 22:45, modifié 3 fois.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#16

Message 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.
Signez ici
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#17

Message 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:

Image

Image

Si tu peut voir de ton coté pourquoi ça coince car perso je vois pas...

cdt
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#18

Message 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.
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11816
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#19

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Steph
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 21 févr. 2009 17:53
Status : Hors ligne

Re: [..] Boucle pour redemarrage de processus simple et multiple

#20

Message 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
Répondre