J'ai depuis un moment pas mal de souci à choisir un modèle de code, une sorte de template, qui permettrait à un script de choisir si son exécution doit être séquentielle ou parallèle à celui du script appelant; sachant que ce choix est à la discrétion du script fils appelé, et non du père...
Ça y est, certains ont décroché
1) Le besoin :
J'ai un script (qu'on appellera père) qui a une interface graphique avec tout plein de boutons, chacun permettant de lancer des scripts différents (qui s'appelleront fils). Les fils sont de deux types particuliers :
- séquentiels, c'est à dire que quand le père lance le fils, le père attend la fin de l'exécution du fils avant de reprendre son cours normal, à la manière d'un RunWait.
- parallèles, c'est à dire que le père lance le fils et continue son chemin sans se préoccuper du reste, comme avec un Run.
Ces modes parallèle et séquentiel sont définis par le fils, c'est le fils qui sait si le père doit attendre qu'il ait fini son boulot, le père n'en sait rien. Petites contraintes (mais pas des moindres), ce système doit fonctionner aussi bien avec des scripts (au3) qu'avec des exécutables (exe), et bien sûr ce choix doit s'abstraire de la machine ou autre.
2) Les idées envisagées :
a) Les sémaphores mutex :
Pour un tel système, le plus simple question architecture aurait été d'utiliser des mutex propres. Grâce à une exclusion mutuelle de sémaphores il est facile de faire un système de rendez vous de processus :
- Le père lance le fils en mode Run sans attente, puis instancie un double mutex pour un rendez vous (l'attente se fait à ce moment donc).
- Le fils se lance. En mode parallèle, il libère le double mutex de rendez-vous directement à son lancement. En mode séquentiel, il libère le double mutex de rendez-vous directement à son extinction.
Malheureusement je n'ai pas trouvé de véritables sémaphores configurables en AutoIt. Même en utilisant user32.dll je n'ai pas réussi a avoir une véritable prise de jeton avec des opérations P et V toutes bêtes.
b) Les propriétés étendues des fichiers :
En utilisant les propriétés étendues des résumés (clic droit sur un fichier > Propriétés > Résumé), il y aurait moyen d'y ajouter une info "Ce programme est en séquentiel" ou "en parallèle". Mais on se heurte à pas mal de souci en utilisant ça : Déjà, les propriétés étendues sur certains fichiers (dont les scripts) sont liés au système d'exploitation/au format du disque, et donc ne peuvent pas s'abstraire de la machine. On perd ce genre d'infos quand on passe sur une clef USB en FAT ou quand on le transfert via FTP ou mail (un peu comme un contact téléphonique avec numéro fixe portable pro adresse mail postale et anniversaire, quand on le copie vers sa carte SIM, le nom est tronqué à 16 caractères et on n'a plus que les numéros de téléphone ^^). Bref, il n'y a pas de constance et mise à part si les infos sont en dur (comme les infos AutoIt3Wrapper après compilation : auteur description version, mais donc on oublie pour les scripts) on ne peut pas en faire grand chose.
c) L'auto-redémarrage : Solution adoptée pour le moment
Il existe un mot magique dans ce système, la chaine de caractères "--LAUNCH" par exemple.
Le père lance tous les fils de la même façon, à la manière d'un RunWait classique sans argument particulier (ou avec certains arguments si besoin, mais pas le mot magique). Les fils séquentiels n'ont qu'à faire leur travail comme tout bon script, s'éteindre et redonner la main au père.
Les fils parallèles quant à eux, ne voyant pas dans $cmdLine le mot magique n'ont plus qu'à se relancer en l'ajoutant à la fin et s'éteindre tout de suite après. Le père reprend alors la main, et le clone du fils avec son "--LAUNCH" poursuit son travail de façon classique, les deux tournants alors en parallèle.
---
Voila un joli pavé, et merci à ceux qui l'ont lu (et compris) jusqu'au bout
Ma question est tout simplement la suivante : Est ce qu'il y a moyen de faire plus efficace, plus simple ou plus sécurisé?
A bientôt !




