[R] Boucle pour redemarrage de processus simple et multiple

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#21

Message par Tlem »

Au lieu de tester la fermeture de chaque processus, pourquoi ne pas tout simplement tout fermer et éventuellement contrôler si la fermeture est OK ?

Code : Tout sélectionner

ProcessWaitClose($PROCES)
ProcessWaitClose("DriveDefrag.exe")
ProcessWaitClose("MemOptimizer.exe")
ProcessWaitClose("OneClick.exe")
ProcessWaitClose("RegistryCleaner.exe")
ProcessWaitClose("RegistryDefrag.exe")
ProcessWaitClose("RescueCenter.exe")
ProcessWaitClose("WinStyler.exe")
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: [..] Boucle pour redemarrage de processus simple et multiple

#22

Message par Iste »

A cause du probleme principale ^^' Ses processe se ferme et se relance de temps a autre, et on cherche un moyen pour verifier qu'ils soient tous reelement fermé

Sinon, c'est pas mieux de faire du ElseIf que du Select (ca revien exactement au meme), mais avec un select, c'est plus claire, et t'as juste a ecrir "Case" a chaque ligne au lieux de IfElse #### Then.
De plus le Select fait un petit decalage sur la droite des condition, donc si t'en a plusieurs les un derrier les autre tu peux mieux les differencier.

Enfin, c'est juste du graphisme codique, donc a toi de voir ce que tu prefere voir / taper.

(apres, ya aussi le switch sur le systeme du select, c'est la meme chose, sauf qu'au lieu d'ecrir "bidule = machin" dans la condition, tu peux te limiter a "machin" (bien sur cela implique que toutes les conditions soient du type "bidule =", mais ca peut etre sympa, je dis ca juste pour info)
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#23

Message par Tlem »

Si le problème est que les processus ce relancent de temps en temps, il suffit de mettre le code que j'ai proposé dans une fonction et de lancer la fonction avant de faire telle ou telle action.
Mais bon ca ne résoudra pas le problème du processus qui ce relance au moment ou on fait l'action. :mrgreen:

Sinon en ce qui concerne la détection des processus, chaque action ProcessExists($Process) prend un certains temps et des ressources machine, donc si il y à de nombreux processus à tester, ce n'est pas la meilleure solution.
L'idéal serais de faire un ProcessList, puis en fonction des processus existant à ce moment là, de supprimer les processus existant (ça me parait plus 'propre').
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: [..] Boucle pour redemarrage de processus simple et multiple

#24

Message par Iste »

Basé sur l'idée de Tlem, une petite fonction qui met en pause le script tant que tout les process demandé ne sont pas fermés.

Code : Tout sélectionner

Func _VerifProcess($ProcessVerif, $pSleep = 500, $pSleepM = 1500)

    Local $Pi
    Local $ProcessList
    Local $AllClose
    Local $AllCloseS

    $AllClose = 1
    $AllCloseS = 1

    While $AllCloseS

        While $AllClose

            $ProcessList = ProcessList()

            $AllClose = 0

            For $Pi = 0 To UBound($ProcessVerif) - 1
                For $Pii = 1 To $ProcessList[0][0]
                    If $ProcessList[$Pii][0] = $ProcessVerif[$Pi] Then $AllClose = 1
                Next
            Next

            Sleep($pSleep)

        WEnd

        Sleep($pSleepM)
        
        $ProcessList = ProcessList()

        $AllCloseS = 0

        For $Pi = 0 To UBound($ProcessVerif) - 1
            For $Pii = 1 To $ProcessList[0][0]
                If $ProcessList[$Pii][0] = $ProcessVerif[$Pi] Then $AllCloseS = 1
            Next
        Next

    WEnd

EndFunc   ;==>_VerifProcess
Premier parametre une Array avec tout les noms des vilains process, parametre secondaire optionel, le temps d'attente entre deux verifications, 3em parametre optionel, le temps d'attente de sécurité.

Car, comme tu as dit que des fois ca merdé, j'ai rajouté un looong Sleep() qui normalement se produit que a la fin (une foi que la fonction pense que tout les process sont terminé pour de bon). Mais qui, avant de repasser la main a ton scrip, verifit une derniere foi (au cas ou).
Donc, si il se produit plus d'une foi, c'est qu'il a evité un bug ;)
(c'est dailleur pour ca que l'idee de Tlem m'a parue interessente, en surchagant moins le processeur, on ralenti moins les reboot des appli, du coup on limite les risque de bug.)

Enfin, la c'est super securisé, donc si ca continu de pas bien marcher, ben c'est qu'on est pas doué

@Tlem : On ne doit surtout pas fermer les process ! le but du script et d'attendre qu'ils se ferment tous. Mais qu'ils se ferment pour de bon, et pas juste quelque secondes. Donc c'est pour ca, on vérifit qu'ils sont tous HS, et si c'est le cas, on attend un peu, au cas ou certain seraient en train de se relancer, pis on referifit qu'ils soient bien tous fermés. Si c'est le cas, on passe a la suite (enfin, moi j'ai rajouté une seconde verification, pour etre sur ^^)
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

#25

Message par Steph »

Salut et merci, vraiment super !

pardonne mon inexperience mais pourrais tu me donner un exemple d'utilisation de ta fonction afin que j'y voit plus clair (:| désolé) avec 3 proc à surveiller afin que je puisse reproduire avec les miens...

Merci d'avance pour tout et encore merci !.

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

#26

Message par Iste »

Declare une variable de type array

Code : Tout sélectionner

Dim $NomDesProcess[3] ; a la place de 3, tu met le nombre de process que tu veux surveiller
Puis donne a chaque array de la variable le nom d'un process

Code : Tout sélectionner

$NomDesProcess[0] = "mspaint.exe"
$NomDesProcess[1] = "notepad.exe"
$NomDesProcess[2] = "autoit3.exe"
;Note bien que les array commence a 0 et finissent a "leur nomnbre d'array"-1
Puis tu peux appeler ma fonction grace à :

Code : Tout sélectionner

_VerifProcess($NomDesProcess)
_VerifProcess($NomDesProcess,800,2000) ; ou bien ca si ca bug trop souvent, a toi de modifier les deux dernier parametres si il faut, comme il faut
Oubli pas de coller la fonction a la fin de ton script et normalement, ca devrait enfin etre bon ! (et assez légé)
► Afficher le texte
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

#27

Message par Steph »

Salut,

alors j'ai testé tout comme indiqué et ça fonctionne au poil ! merci beaucoup, juste pour info (noob exige) il ne faut pas aussi ajouter: #include <Array.au3> au debut du scripte ? car là je ne l'est pas fait et ça fonctionne quand meme mais je prefere demander...

merci encore une fois pour cette superbe fonction !.

ps:

Mon code se compose tel kel:

Code : Tout sélectionner

$AppName = "MonApplication"
$AppDir = @ScriptDir & "\App\" & $AppName & "\"
$PortReg1 = @ScriptDir & "\Data\" & $AppName & "1.reg"
$PortReg2 = @ScriptDir & "\Data\" & $AppName & "2.reg"
Est-ce mieux de le faire ainsi, enfin sera t-il plus facile et rapide à executer que la premiere solution:

Code : Tout sélectionner

$AppName = "MonApplication"
$AppDir = @ScriptDir & "\App\MonApplication\"
$PortReg1 = @ScriptDir & "\Data\MonApplication1.reg"
$PortReg2 = @ScriptDir & "\Data\MonApplication2.reg"
Et faut-il qu'au debut de mon scripte je declare par:

Code : Tout sélectionner

Dim $AppName, $AppDir
Si biensur $AppName = MonApplication et qu'$AppDir ne change pas tout au long de mon scripte ! ou n'est-ce pas utile cela fonctionnant aussi sans... Par contre je saisit pas trop la difference entre Dim & Global ! dois-je utiliser Global ? ayant par contre bien compris Local (utiliser de façon local uniquement, dans des fonctions ou autres..., Dim & Global du debut à la fin du scripte si je ne me trompe)...

cdt

Stef
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

#28

Message par Iste »

<Array.au3> ne sert que pour les fonction de l'udf Array.au3, donc celle qui commencent par _Arrayxxx. Les variable de type array sont gégé nativement pas Autoit (ansi que par tout les autres langage que je connais d'ailleur ^^)

Sinon, je te conseil de garder ce code

Code : Tout sélectionner

$AppName = "MonApplication"
$AppDir = @ScriptDir & "\App\" & $AppName & "\"
$PortReg1 = @ScriptDir & "\Data\" & $AppName & "1.reg"
$PortReg2 = @ScriptDir & "\Data\" & $AppName & "2.reg"
La diference de calcul ne sera pas percerptible, et le jour ou ton app changera de nom, tu en seras bien contant ^^

Pour Dim, je suis pas du tout sur, mais je crois que ca fait une déclaration "par defaut", donc local dans une fonction et global sinon. Mais bon, ca reste a confirmer (ou pas)
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

#29

Message par Steph »

Salut et merci pour tes explications ! ça m'est tres utile et mepermet d'avançer dans le bon sens :mrgreen: .

Sinon en ce qui concerne la premiere boucle que tu m'a proposer, n'aurions nous pas pu faire egalement ainsi, c'est à dire sans surveiller les proces mais en testant tout les 1000 si tout les process = 0 on sort de la boucle ? ou est-ce mieux ainsi en surveillant egalement les processus ? le resultat est le meme il me semble...

Code : Tout sélectionner

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")
    ; si les 5 font 0, c'est qu'ils sont tous stopé, donc on sort.
    If $Etat = 0 Then ExitLoop
    Sleep(800)
WEnd
Ou la meme chose avec un "Do...Until" dont la proposition vraie pour sortir serais $Etat = 0 !.

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

#30

Message par Iste »

Hum je suis pas sur de tout bien avoir compris la question
Mais oui en autoit tu as de nombreuse possibilités pour faire la meme chose
Et comme il ne sagit pas de programme qui demande uneoptimisation optimum (comme les jeux video) on peut se lacher a faire des truc facile a écrir, lire et modifier.
faut juste eviter les truc vraiment trop lourd et lent quand ils durent, et quand ils peuvent poser probleme (ce qui est rare, mais qui est ton cas ^^)

Enfin, moi je suis débutant aussi hein, donc je fais comme je peux avec ce que je sais ^^' tien, je sais meme plus comment marche une "Do...Until"
Signez ici
Répondre