Salut,
Je suis un nouvel utilisateur et j'aimerais savoir quelques choses sur Run Program qui ne m'étaient pas claires depuis le
Documentation. J'utilise JSL pour exécuter un programme externe qui démarre sa propre interface graphique.
1. Existe-t-il un moyen d'intégrer cette interface graphique dans JMP ou de forcer son contenu dans l'interface graphique de JMP ?
2. Il démarre initialement une ligne de commande sur Windows et charge des éléments, puis demande une boîte de dialogue de fichier qui
pour moi, c'est un fichier standard. Est-il possible de fournir automatiquement cela et de supprimer l'ouverture de la boîte de dialogue de fichier ?
3. Il a généré des tracés Matlab tels qu'ils sont écrits dans Matlab. Puis-je forcer le contenu des tracés Matlab dans l'interface graphique JMP ?
4. Le plus important : je peux appeler le programme externe mais la partie script après l'exécution du programme est exécutée
même si le programme n'est pas terminé. Puisque je dois copier des fichiers une fois le programme externe terminé, les fichiers copiés
sont incomplets.
J'essaie de faire ceci (toutes les corrections sont les bienvenues) :
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?");
Merci pour une réponse détaillée. Le problème est que je ne regarde pas de sortie texte. J'espérais s'il y avait un moyen de contenir les fenêtres de l'interface utilisateur
tels que les tracés Matlab créés et activement mis à jour par le programme externe. Le programme externe s'arrête juste avec le dernier tracé qui reste visible et je dois le fermer manuellement. Mais capturer une fenêtre d'interface utilisateur et la placer dans jmp est, je suppose, trop demander à n'importe quelle application.
Merci
en répondant (4), pourquoi JSL, après l'appel RunProgram, s'exécute-t-il trop tôt ?
RunProgram peut se lancer de plusieurs manières. Puisque vous avez fourni une fonction ReadFunction, RunProgram reviendra immédiatement et vous rendra un objet RunProgram contenant des méthodes que vous pouvez tester :
While( run_program << canread | run_program << canwrite | !(run_program << isreadeof),
// show(run_program<<CANREAD></CANREAD>
L'exemple ci-dessus dépend du programme externe qui ferme la connexion à la fin de celle-ci. Il attend brièvement après chaque vérification, puis regarde à nouveau pour voir si le programme est toujours là, en attente de lecture depuis JMP, d'écriture dans JMP, ou s'il n'a tout simplement pas fermé la connexion à partir de laquelle JMP pourrait lire ultérieurement. Le show() commenté aidera à le comprendre.
Une approche plus simple consiste à laisser de côté ReadFunction. Ensuite, RunProgram renvoie simplement le texte imprimé par le programme externe, après le programme externe se termine. Vous pouvez ensuite traiter le texte renvoyé et tous les fichiers créés par le programme externe à l'aide de JSL (pour ouvrir des fenêtres, créer des graphiques, etc.)
La manière compliquée : Si vous vous attendez à ce que JMP affiche les mises à jour dans les fenêtres appartenant à JMP alors que le programme externe s'exécute, vous devrez traiter le texte ReadFunction avec JSL qui réagit au texte. C'est compliqué car le texte peut arriver avec quelques caractères à la fois ; vous aurez besoin d'une stratégie pour collecter les morceaux de texte dans une chaîne JSL et déterminer quand la commande text est terminée et ne pas jeter une partie du suivant commande de texte. Les données que JMP doit afficher peuvent être dans le texte ou dans un fichier, mais la commande de texte reçue vous permet de savoir que les données sont disponibles. (Je ne recommande pas de surveiller la disponibilité d'un fichier, car vous pourriez commencer à utiliser un fichier qui n'est qu'à moitié écrit par le programme externe.)
Écrire la fonction ReadFunction pour qu'elle fonctionne correctement : essayez quelque chose comme ceci :
while(this<<CANREAD></CANREAD>
le processus la fonction utilise ton stratégie pour déterminer si le tampon contient une ou plusieurs commandes de texte complètes, traite la ou les commandes, supprime la ou les commandes et renvoie tout ce qui reste dans le tampon qui fera partie de la prochaine commande de texte. Notez que process(buffer) doit renvoyer l'intégralité du tampon inchangé si la commande n'est pas terminée et doit traiter toutes les commandes de texte du tampon qui sont terminées.
Et, dans toute la partie compliquée ci-dessus, j'ai complètement ignoré la façon dont le programme externe doit être écrit pour générer la sortie imprimée que JMP peut interpréter comme des commandes de texte. Et à quoi pourrait ressembler une stratégie : des nouvelles lignes, des virgules, etc. pour délimiter des commandes complètes.