SHELL commande asynchrone [Résolu]

Signaler
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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)
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019

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
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019

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 !
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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