Aller au contenu

shell + lisp


patacad

Messages recommandés

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

 

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 millisecondes

ceci 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

Lien vers le commentaire
Partager sur d’autres sites

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 est

toujours 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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éo

delai_video c'est la durée en secondes de la vidéo

stop_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...

Lien vers le commentaire
Partager sur d’autres sites

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 ie

Ce 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 que

le 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...

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité