patacad Posté(e) le 13 mars 2008 Posté(e) le 13 mars 2008 Bonjour et merci de m'accueillir sur votre site.Je souhaite vous soumettre un problème .Dans mon programme lisp j’utilise une commande shell qui lance un process en JAVA qui se connecte a un serveur et en fonction des arguments que je passe il me retourne un fichier texte.Mon problème est le suivant :Le fichier texte n’est pas complètement écrit voir inexistant ( temps de réponse) alors que mon lisp continue de se dérouler .Question :Comment attendre que ma commande shell soit complètement terminé ?Merci
Patrick_35 Posté(e) le 13 mars 2008 Posté(e) le 13 mars 2008 Salut A essayer si en testant ton fichier est en lecture seul (donc encore utilisé avec le shell, mais ne fonctionne pas toujours comme avec le bloc note) dans une boucle. (while (not (setq fic (open "Mon_fichier" "a")))) Sinon, il va falloir regarder du coté des Activex @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
patacad Posté(e) le 13 mars 2008 Auteur Posté(e) le 13 mars 2008 merci de votre reponse rapide.ce que j'ai fais pour le moment c'est de faire une bloucle sur la presence du fichier et ensuite une boucle sur la lecture du fichier mais je ne pense pas que cela soit bon.merci je vais essayer
bonuscad Posté(e) le 13 mars 2008 Posté(e) le 13 mars 2008 Un truc que je fais: (command "_shell" bla-bla-bla)(prompt "\nAppuyer sur une touche pour continuer!")(grread)C'est toi qui décide quand c'est bon.... ou utiliser la (command "_.delay" 50000) entier pour les millisecondesceci si tu sais combien bien de temps il faut à ton programme pour son exécution. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 13 mars 2008 Posté(e) le 13 mars 2008 patacad Je parlais de tester si ton fichier est utilisé ou pas.Normalement, lors de l'écriture du fichier, il est indiqué pour les autres applications qu'il est en lecture seul.Un (open "mon_fichier" "a") qui me donne comme résultat nil indique que le fichier est en lecture seul, d'où la boucle et le sens du lisp ci-dessus. Sinon, après quelques recherches dans mes tablettes, je t'en propose un autre qui évite le test sur le fichier et regarde si une fenêtre shell esttoujours active. (defun appli(qui / apps item lst meth1 meth2 WMI) (setq WMI (vlax-create-object "WbemScripting.SWbemLocator") meth1 (vlax-invoke WMI 'ConnectServer nil nil nil nil nil nil nil nil) meth2 (vlax-invoke meth1 'ExecQuery "Select * from Win32_Process") ) (vlax-for item meth2 (setq lst (cons (vlax-get item 'CommandLine) lst)) ) (foreach item (list WMI meth1 meth2) (vlax-release-object item) ) (vl-remove-if-not '(lambda(x) (and x (vl-string-search (strcase qui) (strcase x)))) lst) ) Pour tester, tu lances une session dos ou shell (touche windows+r --> cmd+entrée)Et cette boucle qui ne se terminera que si tu tapes exit sur la ligne de commande dans la fenêtre dos/shell (while (appli "cmd.exe")) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 14 mars 2008 Posté(e) le 14 mars 2008 Salut, Patrick_35: très pratique ton code pour connaitre les processus qui tourne sur le pc :D Tu fais comment pour les killer? Car pour un des mes lisps, j'ai fait des captures vidéos de mon écran pour expliquer comment utiliser les fonctions et lorsqu'on demande de l'aide sur une fonction je lance mediaplayer pour lire la vidéo, mais je ne sais pas comment le fermer. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
bseb67 Posté(e) le 14 mars 2008 Posté(e) le 14 mars 2008 C'est bon, j'ai trouvé en cherchant WbemScripting.SWbemLocator sur google une page en russe: (defun killApp (appName / Server processList) (setq Server (vlax-invoke-method (vlax-create-object "WbemScripting.SWbemLocator") 'ConnectServer nil nil nil nil nil nil nil nil ) ) (setq processList (vlax-invoke Server 'ExecQuery (strcat "Select * from Win32_Process Where Name = '" appName "'"))) (vlax-for app processList (vlax-invoke app 'Terminate) ) (vlax-release-object Server) ) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 14 mars 2008 Posté(e) le 14 mars 2008 Salut Bravo Juste une autre manière de faire en utilisant le nom même partiel.(defun kille(qui / item meth1 meth2 obj WMI) (setq WMI (vlax-create-object "WbemScripting.SWbemLocator") meth1 (vlax-invoke WMI 'ConnectServer nil nil nil nil nil nil nil nil) meth2 (vlax-invoke meth1 'ExecQuery "Select * from Win32_Process") ) (vlax-for item meth2 (and (setq obj (vlax-get item 'CommandLine)) (vl-string-search (strcase qui) (strcase obj)) (vlax-invoke item 'Terminate) ) ) (foreach item (list WMI meth1 meth2) (vlax-release-object item) ) ) Et pour tester toujours avec le fenêtre shell comme exemple(kill "cmd.exe") Mais je trouve plus simple de piloter directement le média player avec(setq mp (vlax-create-object "MediaPlayer.MediaPlayer"))Ou(setq mp (vlax-create-object "WMPlayer.OCX"))Par contre, je n'ai pas encore reussi à afficher la vidéo, mais aucun problème avec les mp3 @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 17 mars 2008 Posté(e) le 17 mars 2008 Salut! Pour ouvrir médiaplayer je fais ceci: (startapp (dos_regget "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Multimedia\\MPlayer2" "Player.Path") filename) ; met une pause qui dure le temps de la vidéo (command "_.delay" (* delai_video 1000)) ; on arrete mediaplayer (stop_processus "Mplayer2.exe") Regget me sert pour connaitre le chemin de mplayer2,filename c'est en fait le chemin+nom de la vidéodelai_video c'est la durée en secondes de la vidéostop_processus c'est la fonction killapp Mais je serai intéressé de voir comment à du vlisp tu lis un fichier.Le vlisp me paraît très puissant (comme dirait mon premier prof d'info), mais elle m'est très inconnue. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 17 mars 2008 Posté(e) le 17 mars 2008 Salut Le vlisp est tès puissant et en général, je fais une traduction de vbs en vlisp.En voici un autre exemple qui lance une vidéo. Je n'ai pas trouvé comment fermer proprement le proccess (sans utiliser un killer).(setq video "Une_video.avi") (setq mp (vlax-create-object "WMPlayer.OCX")) (vlax-invoke mp 'openPlayer (findfile video)) (vlax-release-object mp)Sinon, une aute piste en utilisant (vlax-create-object "MediaPlayer.MediaPlayer"), et en y inscrivant des instuctions htlm, ou java, à voir. Je n'ai pas eu encore le temps de bien finaliser.(setq video "Une_video.avi") (setq ie (vlax-create-object "InternetExplorer.Application")) (foreach item (list 'MenuBar 'Toolbar 'AddressBar 'StatusBar) (vlax-put ie item 0) ) (vlax-put ie 'Width 350) (vlax-put ie 'Height 278) (vlax-put ie 'Left 96) (vlax-put ie 'Top 150) (vlax-invoke ie 'Navigate "about:blank") (vlax-put ie 'Resizable -1) (setq doc (vlax-get ie 'Document)) (vlax-put doc 'Title (findfile video)) (foreach item '("[b]<[/b]html>" "[b]<[/b]head>[b]<[/b]title>Windows Media Player[b]<[/b]/title>[b]<[/b]/head>" "[b]<[/b]body>" "[b]<[/b]OBJECT id=""VIDEO"" width=""320"" height=""240""" "style=""position:absolute; left:0;top:0;""" "CLASSID=""CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6""" "type=""application/x-oleobject"">" "[b]<[/b]PARAM NAME=""URL"" VALUE=""" & video & """>" "[b]<[/b]PARAM NAME=""SendPlayStateChangeEvents""VALUE=""True"">" "[b]<[/b]PARAM NAME=""AutoStart"" VALUE=""True"">" "[b]<[/b]PARAM name=""uiMode"" value=""full"">" "[b]<[/b]PARAM NAME=""showControls"" VALUE=""1"">" "[b]<[/b]PARAM name=""PlayCount"" value=""1"">" "[b]<[/b]/OBJECT>[b]<[/b]/body>[b]<[/b]/html>") (vlax-invoke doc 'WriteLn item) ) (vlax-put ie 'visible -1) (vlax-release-object ieCe qui est intéressant, c'est que tu peux contrôler ta vidéo, créer des listes, connaître le temps. Une foule de fonctions utiles. @+ [Edité le 17/3/2008 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 17 mars 2008 Posté(e) le 17 mars 2008 Re, pour les vlax-invoke, comment tu sais ce que tu peux appeler sur un objet, y-a-t-il une fonction qui te liste les possibilités? J'ai trouvé, il y a quelques mois un fichier doc avec toutes les fonctions lisp, vlisp, mais il n'y a quele listing :(.Je suis très avide connaissances maintenant que je travail sous autocad vu que cela me plaît pas mal. Merci encore pour les infos. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 17 mars 2008 Posté(e) le 17 mars 2008 Re,Je viens de voir que mon message précédent n'est pas complet. C'est corrigé Pour connaître les instructions, en générale un (vlax-dump-object Objet_activex T) fonctionne.Sinon, il reste la recherche sur internet, et comme je le disais, une traduction vbs (vbscript), mais parfois aussi du vba, java, html, c++.Généralement, il suffit de regarder la structure des programmes, comment s'écrivent les instructions pour deviner les instructions vlisp. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
fred06 Posté(e) le 21 mars 2008 Posté(e) le 21 mars 2008 Merci à Tous,J'ai essayé la premiere version de Patrick35 et cela marche sans probleme.
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant