SHELL commande asynchrone

Résolu
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019 - 17 févr. 2008 à 14:54
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 17 févr. 2008 à 19:22
Bonjour,
Dans Access, la commande Shell est définie comme asynchrone, c'est à dire que les lignes de code suivant la ligne Shell sont lues et exécutées indépendamment du fait que le programme externe ayant été lancé par Shell ait fini ou non son boulot.
C'est mon problème. Mon programme externe manipule des tables de ma base de données et les lignes suivant Shell dans Access vident ces tables (je n'en ai plus besoin). Conclusion, VB me dit qu'on est deux à vouloir modifier simultanément les mêmes données (création (externe) + suppression (Access) !)
Y'a-t-il un moyen dans Access de dire de ne pas continuer le code tant que le programme externe n'a pas fini ? Je peux connaître l'ID du processus externe grâce à la commande Shell. Mais je ne sais pas dire à Access "Attend que le processus n° ID soit fini pour continuer"...
Merci de vos réponses.
Apolinaire

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 févr. 2008 à 17:09
Tu peux regarder ma source, voir si elle t'inspire.
Elle est faite pour du VB6, mais je pense qu'elle est transposable en VBA

L'astuce est d'ouvrir (OpenProcess) un handle sur le pid obtenu avec Shell

Ensuite tu fait une attente (WaitForSingleObject) sur cet handle.

Le résultat est que tant que le programme correspond à l'handle n'est pas fermé, ton appli (ici Access donc) est figée.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 févr. 2008 à 17:16
Salut
Si tu es dans Access, tu fais du VBA et pas du .Net --> Catégorie modifiée
C'est important car les langages peuvent avoir des solutions différentes et si tu veux des réponses claires, il faut poser des questions claires, sinon, ça va discuter pendant des jours pour s'apercevoir que telle ou telle solution ne fonctionne pas. Ca fait gagner du temps à tout le monde. Merci.

C'est en effet un problème classique de communication entre deux mondes/langages.
Pour lancer une commande ET attendre qu'elle soit terminée, plusieurs solutions :

- Demander à l'application lancée de signaler la fin d'exécution, par exemple en créant un fichier texte avec un nom particulier. Le programme de lancement devra simplement attendre, après la commande Shell, que ce fichier apparaisse sur le répertoire (+ gérer son effacement pour la prochaine fois).

- Les méthodes DDE (Dynamic Data Exchange) :
Là, suffit de regarder dans l'aide, mais mise en application pointue, il faut bien comprendre le mécanisme avant de se lancer.

- Gérer la commande Shell en gérant les Process :
Cette solution plus compliquée mais moins bricolage, lance le programme en récupérant les identifiants du process ainsi créé, puis attend la disparition de ce process avant de rendre la main au programme de lancement.
Cette solution s'appuie sur les APIs de Windows (pas Vista).
Un exemple de 'SuperShell' est décrit dans les exemples de 'API-Guide', logiciel gratuit de doc et exemple autour des APIs les plus courantes. Disponible ici
L'exemple 'SuperShell' est associé à l'API WaitForSingleObject

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019
17 févr. 2008 à 18:48
Re,
Merci de votre aide.

@casy : j'ai vu ton code et il semble que c'est tout à fait ce qu'il me faut. Je l'essaierai c'est sûr.

@jack : désolé de m'être trompé de forum... C'est la première fois que je l'utilise et je n'avais pas saisi toutes les subtilités. Quand j'ai vu Access j'ai foncé. Promis, je ferai attention la prochaine fois.
J'ai téléchargé et installé API-Guide mais quand je le lance j'ai une "Erreur d'exécution '5' Argument ou appel de procédure incorrect". De ce fait, j'ai installé aussi le runtime VB5 au cas où, redémarré l'ordinateur mais l'erreur est toujours là. NB : je suis sous XP Pro SP2 avec VB6 installé (et maintenant le runtime VB5 !)

@vous deux : je ne connais pas les boutons "Réponse acceptée !". Bien sûr que j'accepte vos réponses, mais j'ai droit à une ou à plusieurs ? Je n'ai pas encore osé cliquer !

Apolinaire
0
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019
17 févr. 2008 à 18:50
Ah ben même quand c'est moi qui répond, je peux accepter ma réponse ! C'est fabuleux !
C'est mon avis et je le partage !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 févr. 2008 à 19:21
TU peux accepter plusieurs réponses si necessaires.

La règle est de n'accepter que les réponses qui t'on réellement aidées ou qui t'ont apporté la réponse.

Cela permet à ceux qui viendront lire plus tard ton messages parce qu'ils ont le même problème, d'identifier imédiatement que le problème est résolu et donc les solutions possibles.

Cela permet aussi à certains membres qui ne souhaitent pas prendre (ou n'ont pas ) le temps de lire tous les sujets de zapper ceux qui sont acceptés car potentiellement déjà résolus.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 févr. 2008 à 19:22
Sachant qu'une réponse acceptée peut ensuite, au besoin,  etre retirée si après essai la solution ne convient pas

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Rejoignez-nous