Ejecutando programa externo con JMPHola,
Soy un usuario nuevo y me gustaría saber un par de cosas sobre Ejecutar programa que no me quedaron claras desde el
documentación. Estoy usando JSL para ejecutar un programa externo que inicia su propia interfaz gráfica de usuario.
1. ¿Hay alguna manera de incrustar esta interfaz gráfica de usuario en JMP o forzarla a estar contenida dentro de la interfaz gráfica de usuario de JMP?
2. Inicialmente inicia una línea de comando en Windows y carga cosas y luego solicita un diálogo de archivo que
para mí es un archivo estándar. ¿Es posible proporcionar esto automáticamente y suprimir la apertura del cuadro de diálogo del archivo?
3. Generó diagramas de matlab tal como está escrito en matlab. ¿Puedo forzar que los gráficos de Matlab estén contenidos en JMP gui?
4. Lo más importante: puedo llamar al programa externo, pero se ejecuta la parte del script después de Ejecutar programa
incluso si el programa no ha terminado. Como tengo que copiar archivos después de que finalice el programa externo, los archivos copiados
están incompletos.
Estoy tratando de hacer esto (cualquier corrección es bienvenida):
some_function = Function({x},
//This function I wish to execute after the some_exe is finished
//or I have closed all of its gui components manually.
);
Show("this executes before run program"); //ok, as expected.
run_program = Run Program(
Executable(some_exe), //Works but execution through .bat doesn't.
Read Function(some_function),
);
Show("This also executes before external program finishes. Why?");
Re: Ejecutar programa externo con JMPGracias por una respuesta detallada. El problema es que no estoy mirando una salida de texto. Esperaba que hubiera una forma de contener las ventanas de la interfaz de usuario.
como gráficos de matlab creados y actualizados activamente por el programa externo. El programa externo simplemente se detiene con el último gráfico que permanece visible y tengo que cerrarlo manualmente. Pero capturar una ventana de interfaz de usuario y ponerla dentro de jmp es demasiado para cualquier aplicación.
Gracias
Re: Ejecutar programa externo con JMPrespondiendo (4), ¿por qué JSL, después de la llamada RunProgram, se ejecuta demasiado pronto?
RunProgram puede iniciarse de varias formas. Dado que proporcionó una ReadFunction, RunProgram regresará inmediatamente y devolverá un objeto RunProgram que tiene métodos que puede probar:
While( run_program << canread | run_program << canwrite | !(run_program << isreadeof),
// show(run_program<<CANREAD></CANREAD>
El ejemplo anterior depende del programa externo que cierra la conexión cuando termina. Espera brevemente después de cada verificación, luego vuelve a mirar para ver si el programa todavía está disponible, esperando para leer de JMP, escribir en JMP o simplemente no ha cerrado la conexión de la que JMP podría leer más adelante. El show() comentado ayudará a resolverlo.
Un enfoque más simple es omitir ReadFunction. Entonces RunProgram solo devuelve el texto que imprimió el programa externo, después el programa externo finaliza. Luego puede procesar el texto devuelto y cualquier archivo que el programa externo haya creado usando JSL (para abrir ventanas, hacer gráficos, etc.)
el camino complicado : si espera que JMP muestre actualizaciones en ventanas propiedad de JMP tiempo se ejecuta el programa externo, deberá procesar el texto ReadFunction con JSL que reacciona al texto. Esto es complicado porque el texto puede llegar con algunos caracteres a la vez; necesitará una estrategia para recopilar los bits de texto en una cadena JSL y determinar cuándo se completa el comando de texto y no desechar parte del Siguiente comando de texto Los datos que JMP debe mostrar pueden estar en el texto o en un archivo, pero el comando de texto recibido es la forma en que sabe que los datos están disponibles. (No recomiendo ver si un archivo está disponible porque podría comenzar a usar un archivo que el programa externo solo ha escrito a medias).
Escribiendo ReadFunction para que funcione bien: intente algo como esto:
while(this<<CANREAD></CANREAD>
la proceso usos de funciones su estrategia para determinar si el búfer contiene un comando de texto completo, procesa el comando, elimina el comando y devuelve lo que queda en el búfer que formará parte del siguiente comando de texto. Tenga en cuenta que el proceso (búfer) debe devolver el búfer completo sin cambios si el comando no está completo y debe procesar todos los comandos de texto en el búfer que están completos.
Y, en toda la parte complicada anterior, ignoré por completo cómo se debe escribir el programa externo para generar la salida impresa que JMP puede interpretar como comandos de texto. Y cómo podría verse una estrategia: nuevas líneas o comas, etc. para delimitar comandos completos.