[R] Programme asynchrone

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

[R] Programme asynchrone

#1

Message par JamesPatageule »

Bonjour,

J'ai une question très simple sous autoit.

Je cherche à exécuter un script en asynchrone. Le but étant que ce script tourne en tâche de fond et soit totalement détaché du processus père qui l'a invoqué.

J'aimerais que cela soit possible soit
- par un script annexe qui ne fait que lancer le script voulu et qui s'en détache.
- par le script qui est capable de faire ça lui même.

Le comportement devrait être le même que la commande "call" en batch ou que le "&" en bash.

Je souhaite par contre que le processus fils reste en vie, même après la mort du processus père !

Merci d'avance.
Modifié en dernier par JamesPatageule le sam. 05 juin 2010 00:23, modifié 1 fois.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Programme asynchrone

#2

Message par GaRydelaMer »

Bonjour

Soit Prog1.exe, Prog2.exe, 2 scripts AutoIt

Dans Prog1.exe, simplement: Run("Prog2.exe") suffit.

Voir la doc de la commande Run pour plus de paramètres, le dossier de travail pour prog2, la vue (Invisible, Minimiser, Maximiser).

De plus la commande renvoie a Prog1.exe le PID (identifiant du processus) ainsi tu peux le piloter, lire les valeurs ou y écrire par l'interface standard d'entrée sortie, ou le fermer.
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#3

Message par JamesPatageule »

Merci de la réponse,

Je peux me tromper, mais si Prog1.exe fait un run( "Prog2.exe"), et que ensuite Prog1.exe se termine, il ne tue pas de façon automatique Prog2.exe (car Prog1 est le père de Prog2 ?) ?

Je fait test demain matin pour être certain ... lol
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Programme asynchrone

#4

Message par matwachich »

JamesPatageule a écrit :Merci de la réponse,

Je peux me tromper, mais si Prog1.exe fait un run( "Prog2.exe"), et que ensuite Prog1.exe se termine, il ne tue pas de façon automatique Prog2.exe (car Prog1 est le père de Prog2 ?) ?

Je fait test demain matin pour être certain ... lol
Rien à voir! c'est pas parceque un prog en lance un autre, qu'il le tue quand il meurt lui même!
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#5

Message par JamesPatageule »

matwachich a écrit :Rien à voir! c'est pas parceque un prog en lance un autre, qu'il le tue quand il meurt lui même!
Je dirais que cela dépends de la façon dont le second programme est exécuté ! Il peut être totalement lié au père ...

Enfin dans mon cas effectivement AutoIT détache les process.
J'avais une faute de frappe qui biaisait mon test ... lol

Merci bien donc, j'ai fait un prog autoit "Launcher" qui ne fait que lancer un autre prog.

Question bonus, est-il possible de faire en sorte que le prog principal soit lui-même capable de faire ça sans le Launcher ?
Je pense que non, mais on sait jamais ...

Encore merci en tous cas !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#6

Message par Tlem »

Je ne vois pas ou est le problème. :shock:
Vous n'avez qu'à inclure le code du Launcher dans le programme principal.
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#7

Message par JamesPatageule »

Oui je pourrais mais il faudrait donc que le programme s'auto appelle ...

Mon soucis est que le Prog2.exe ne rend pas la main, il contient une grosse boucle (1heure).
En fait ce programme est une GUI qui se met en premier plan avec une barre de progression et qui ne fait QUE bloquer les commandes et afficher un message.

En fait j'utilise des séquenceurs PERL pour faire des tâches.
Dans l'ordre :
1 - Prog2.exe --start
2 - ma commande 1
3 - ma commande 2
4 - ma commande 3
5 - Prog2.exe --stop

En fait le but étant que l'utilisateur ne voie pas les commandes.
Mais mon soucis avec ma boucle c'est que le programme ne rends pas la main et donc la suite ne s'exécute pas.

Si j'utilise le launcher pour lancher Prog2.exe, le launcher renvoie un EXIT 0 et donc rends la main, alors que le Prog2.exe lui tourne encore vu qu'il est un fork.

Je cherche un moyen de reproduire le comportement mais sans passer par le launcher.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#8

Message par Tlem »

Votre description reste encore trop vague pour une aide précise.
Donnez nous plus de détails sur l'ordre de vos actions, sur qui fait quoi et comment, pour que éventuellement on puisse vous répondre ...

Des bout de code ou des exemples de ce que vous avez fait seraient appréciables et d'une grande aide. :roll:
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#9

Message par JamesPatageule »

Merci pour la réponse.

Ci-joint un dossier compressé avec un exemple EXACT de mon code.

Procédure de test :
1 - Télécharger et décompresser l'archive.
2 - Tester les fichiers BAT à la racine du dossier décompressé :
+ "test1.bat" montre le comportement SANS le fameux "launcher"
+ "test2.bat" montre le comportement AVEC le fameux "launcher"

La différence étant :
Avec "test1.bat" : Il faut attendre la fin de l'écran d'attente (30 secondes) avant de déclencher la commande de ping et la suivante.
Avec "test2.bat" : La commande de ping se lance en MEME TEMPS que l'écran d'attente et donc tourne en arrière plan. ceci est grâce au Launcher.

Je précise que le "CMD /C" est requis et je ne peut pas le remplacer par autre chose (embarqué dans un autre script que je ne maitrise pas)

Ainsi je souhaiterais modifier le programme "SplashScreen.au3" afin qu'il ai le même comportement que quand il est lancé par le Launcher, mais sans ce dernier.

Merci d'avance.

PS : pour sortir de l'écran d'attente, la combinaison est : CRTL (gauche) + SHIFT (droit) + F11 :roll:
Fichiers joints
MyExample.zip
Exemple
(892.27 Kio) Téléchargé 81 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#10

Message par Tlem »

J'ai jeté un oeil sur votre code, mais j'avoue avoir du mal à comprendre la finalité de celui-ci.

Ce qui me perturbe le plus, c'est votre écran d'attente. Vous essayez de piloter cette application par des commandes Start/Stop. :shock:

Personnellement j'irais par un plus court chemin. :roll:

Une application principale qui gère les événements à gérer.
L'écran d'attente quant à lui il sera géré simplement par son lancement lorsque j'en ai besoin et par un ProcessClose lorsque je veut le terminer ...

Peut être que vos besoin sont plus complexes que cette simple application, mais dans ce cas il en faudrait plus pour nous éclairer. :mrgreen:
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#11

Message par JamesPatageule »

Bonjour,

Je vais vous exposer ce que je souhaite faire et vous comprendrez mieux.

Mon but est de faire des opérations de maintenance sur des postes windows dans un par informatique.
Les opérations seront :
- Installation de logiciels
- Paramétrages divers
- Copies de fichiers
- Récupérations de données

Les contraintes sont des systèmes annexes comme "Windows Unattended" ou "wpkg". ils permettent de faire des installations auto de Windows et de logiciels.

J'ai donc souhaité avoir un maximum de souplesse et donc je souhaite garder des exécutables indépendants et utilisables selon mon besoin à l'instant T.

Donc dans le cas présent, je souhaite avoir un écran d'attente qui prend tout l'affichage et qui bloque les contrôles utilisateurs. Et donc pendant ce temps et donc en arrière plan, je fait un grand nombre de choses que je ne souhaite pas que les utilisateurs voient ou même bloquent avec des clics ou des touches clavier.
Je ne souhaite PAS dupliquer le code dans chaque exécutable afin de garder un bon contrôle, simplifier le code et viser la pérennité.

J'ai donc fait un fichier "SplashScreen.exe" qui affiche un écran d'attente et qui bloque les contrôles. Ainsi je peux quand je le veux bloquer ou débloquer l'écran et ce depuis des scripts séquencés et automatisés !
J'ai donc fait 2 paramètres au programme, un "--start" et un "--stop".
- Le START lance une instance du SplashScreen uniquement s'il en existe pas déjà une.
- Le STOP tue tous les processus de SlpashScreen existant.

Voila simplement.

Le soucis donc vient que dans mes séquencements de commandes (dont je ne contrôle pas le mode d'exécution), quand j'éxécute la commande

Code : Tout sélectionner

SplashScreen.exe --start
Alors l'instruction qui suivra ne sera exécutée que quand le processus se terminera. Donc jamais (enfin 60 minutes dans la réalité car j'ai mis un TIMER).
PS : Dans l'exemple envoyé, le TIMER est à 30 secondes afin de simplifier les tests !

Je souhaiterais que le "SplashScreen.exe --start" ne soit pas bloquant et qu'il soit lancé en arrière plan.
Le problème étant que je ne peut pas car c'est gèré dans les scripts que je ne maîtrise pas !

Donc j'ai besoin d'un système qui lance le SplashScreen.exe et qui rend la main.

C'est donc ici que j'ai créé "ScriptLauncher.exe" qui lui sait UNIQUEMENT faire un run() d'une commande. Ainsi il lance mon SplashScreen en processus distinc sans attentre la fin, et rend la main.
Donc dans ce cas, mes commandes en arrière plan se font correctement !!!

Mon objectif ici est uniquement de supprimer ce fameux "ScriptLauncher.exe" que je trouve étant superflux si on peut faire autrement.

Donc en fait c'est vraiment de la curiosité et du confort ! lol

En espérant avoir été vraiment clair !

PS : Si je m'étends pas toujours sur les forums c'est que c'est pas si courant de trouver des gens qui ont vraiment à coeur d'aider les autres et qui en prennent le temps, et que bien souvent sur les forums (pas ici) un long message signifie pas de réponse et donc du temps pour rien ! Donc au passage ENCORE MERCI pour l'aide et l'esprit qui règne ici !!!
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#12

Message par Tlem »

Donc, j'ai lu votre message et donc compris l'esprit. Je vais donc vous exposer ... donc, mon point de vue. :lol:

Pour faire ce que vous recherchez, je verrais plutôt une autre ligne de conduite.
Afin d'être simple et évolutif, ce que je verrais c'est un programme principal qui ce charge de l'exécution de 'séquences'.
Quand je parle de séquences, ce serait un truc dans le genre :
1 programme de 'pilotage'.
1 Fichier séquence (texte, ini ou autre) qui contient la suite des événements à réaliser.
X Scripts d'exécution de divers installations.

Le programme de pilotage lit et exécute les instructions du fichier de séquence tel que par exemple :
  • - Affiche l'écran d'attente.
    - Lance le programme ou le script 1 / avec attente de fin de processus ou non.
    - Lance le programme ou le script 2 / avec attente de fin de processus ou non.
    - Masque ou termine l'écran d'attente.
    - Affiche une fenêtre de choix.
    - Affiche l'écran d'attente.
    - Lance le programme ou le script 3 / avec attente de fin de processus ou non.
    - etc ...
    - Termine l'écran d'attente.
    - Quitte le programme de pilotage.
L'avantage de ce système, c'est que vous pouvez rajouter dans le programme de pilotage un contrôle de la durée d'installation du programme X, Y ou Z et prendre des mesures particulières (Kill du process) si l'installation venait à durer trop longtemps, ce qui éviterait des risques de blocage lors de l'exécution des séquences. ;)
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#13

Message par JamesPatageule »

Merci de la réponse qui est très censée !

Car en effet, les exécutables et ma question portent justement sur ça.

Mon but est de mettre mes programmes dans un séquenceur ... Le fameux programme unattended que je ne maîtrise pas !

Et je ne souhaite pas faire un système parallèle pour ne pas alourdir le système, et surtout car celui existant gère déjà tout donc les séquencement intercalés de redémarrages système ... je ne souhaite pas réinventer la roue ...

Et c'est donc ce séquenceur qui qui lance mon SplashScreen.exe de façon synchrone et qui attend le code de retour !

C'est donc pourquoi je cherche un système comme expliqué plus haut qui bypass cela.

Merci bien en tous cas.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#14

Message par Tlem »

JamesPatageule a écrit :C'est donc pourquoi je cherche un système comme expliqué plus haut qui bypass cela.
Le plus simple serait de bypasser le premier 'séquenceur'. :mrgreen:
Mais je suppose que vous avez une contrainte de ce coté là ... :roll:

De toutes façon, si j'ai bien compris votre problématique, le 'séquenceur primaire' est déjà fait et non modifiable par vous.
La seule chose que vous pouvez faire c'est intercaler le lancement d'une application (SplashScreen.exe) qui doit être capable de gérer l'installation d'applications complémentaires à la liste de ceux du 'séquenceur primaire'.

Pouvez-vous confirmer ou infirmer ?

Si j'ai tout faux, alors je vous demanderais de poser votre problématique par morceaux simple (genre : mon script doit faire ça puis exécuter ça), ce qui nous permettra d'avancer dans le sujet.
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#15

Message par JamesPatageule »

Pile poil dans le mile !

J'ai un séquenceur primaire que je ne maîtrise pas et auquel je dois me plier. Et même si finalement j'en suis bien heureux car pas besoin de le réécrire, faut accepter quelques petites contraintes (rien n'est parfais !).

Donc oui je file des listes d'ordres à mon séquenceur primaire qui ressemblent à ce qui suit :
1 - Démarre le SplashScreen
2 - Exécute mon pool de tâches A
3 - Arrête le SplashScreen
4 - Redémarre
5 - Démarre le SplashScreen
6 - Exécute mon pool de tâches B
7 - Arrête le SplashScreen
....

J'ai comme ça X tâches diverses qui vont du formatage de disque, à l'install d'applications en passant par la copie de fichiers et les modifications registres.

Le séquenceur primaire les enchaîne à la perfection, le seul bémol est l'impossibilité de lui faire lancer en arrière plan une tâche.

C'est ici que je suis venu sur le forum pour vos conseils, et que j'ai fait le fameux "Launcher". Ce dernier que je souhaite maintenant supprimer et donc trouver un autre moyen plus propre de le remplacer.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#16

Message par Tlem »

Toujours dans l'optique de clarifier votre demande, votre problème viendrait donc du SplashScreen. :roll:

Le pool d'applications A, B, etc ... Ne vous pose donc aucun problème, c'est juste le fait que le SplashScreen vous bloque la suite du 'séquenceur' car tant que le SplashScreen est en fonction, le séquenceur ne peut continuer. :roll:

C'est bien cela ?
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#17

Message par JamesPatageule »

Exactement !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#18

Message par Tlem »

Et donc vous cherchez une solution pour lancer SplashScreen avec la gestion de la ligne de commande de manière à l'afficher ou non, mais celui-ci ne doit pas bloquer le 'séquenceur' et renvoyer une valeur.

C'est bien cela ?
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é".
JamesPatageule
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 21 avr. 2009 11:47
Status : Hors ligne

Re: [..] Programme asynchrone

#19

Message par JamesPatageule »

C'est bien ça !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Programme asynchrone

#20

Message par Tlem »

Whaouuu, tous ces messages pour ça ... :?

Bon reste encore un mystère à élucider :
Que doit retourner SplashScreen lorsqu'il est lancé en On et en Off ?
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é".
Répondre