SHELL commande asynchrone [Résolu]

cs_Apolinaire 42 Messages postés mardi 6 décembre 2005Date d'inscription 9 novembre 2013 Dernière intervention - 17 févr. 2008 à 14:54 - Dernière réponse : cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 févr. 2008 à 17:09
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_casy
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 17 févr. 2008 à 17:16
0
Utile
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)
Commenter la réponse de cs_Jack
cs_Apolinaire 42 Messages postés mardi 6 décembre 2005Date d'inscription 9 novembre 2013 Dernière intervention - 17 févr. 2008 à 18:48
0
Utile
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
Commenter la réponse de cs_Apolinaire
cs_Apolinaire 42 Messages postés mardi 6 décembre 2005Date d'inscription 9 novembre 2013 Dernière intervention - 17 févr. 2008 à 18:50
0
Utile
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 !
Commenter la réponse de cs_Apolinaire
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 févr. 2008 à 19:21
0
Utile
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
Commenter la réponse de cs_casy
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 févr. 2008 à 19:22
0
Utile
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
Commenter la réponse de cs_casy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.