Esecuzione di un programma esterno con JMPCIAO,
Sono un nuovo utente e vorrei sapere un paio di cose su Run Program che non mi erano chiare dal
documentazione. Sto usando JSL per eseguire un programma esterno che avvia la propria GUI.
1. Esiste un modo per incorporare questa GUI in JMP o forzarla a essere contenuta nella GUI di JMP?
2. Inizialmente avvia una riga di comando su Windows e carica materiale, quindi richiede una finestra di dialogo del file che
per me è un file standard. È possibile fornirlo automaticamente e sopprimere l'apertura della finestra di dialogo del file?
3. Ha generato grafici matlab come è scritto in matlab. Posso forzare che i grafici Matlab siano contenuti nella GUI JMP?
4. La cosa più importante: riesco a chiamare il programma esterno ma viene eseguita la parte dello script dopo Esegui programma
anche se il programma non è terminato. Poiché devo copiare i file al termine del programma esterno, i file copiati
sono incompleti.
Sto provando a fare questo (qualsiasi correzione è benvenuta):
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?");
Ri: Esecuzione di un programma esterno con JMPGrazie per una risposta dettagliata Il problema è che non sto guardando un output di testo. Speravo che ci fosse un modo per contenere le finestre dell'interfaccia utente
come i grafici Matlab creati e aggiornati attivamente dal programma esterno. Il programma esterno si ferma semplicemente con l'ultimo grafico che rimane visibile e devo chiuderlo manualmente. Ma catturare una finestra dell'interfaccia utente e inserirla in jmp è, immagino, chiedere troppo a qualsiasi applicazione.
Grazie
Ri: Esecuzione di un programma esterno con JMPrispondendo (4), perché JSL, dopo la chiamata RunProgram, viene eseguito troppo presto?
RunProgram può essere avviato in diversi modi. Poiché hai fornito una ReadFunction, RunProgram restituirà immediatamente un oggetto RunProgram con metodi che puoi testare:
While( run_program << canread | run_program << canwrite | !(run_program << isreadeof),
// show(run_program<<CANREAD></CANREAD>
L'esempio sopra dipende dal programma esterno che chiude la connessione quando termina. Attende brevemente dopo ogni controllo, quindi controlla nuovamente per vedere se il programma è ancora in giro, in attesa di leggere da JMP, scrivere su JMP o semplicemente non ha chiuso la connessione da cui JMP potrebbe essere in grado di leggere in seguito. Lo show() commentato aiuterà a capirlo.
Un approccio più semplice consiste nel tralasciare ReadFunction. Quindi RunProgram restituisce semplicemente il testo stampato dal programma esterno, Dopo il programma esterno termina. È quindi possibile elaborare il testo restituito e tutti i file creati dal programma esterno utilizzando JSL (per aprire finestre, creare grafici, ecc.)
Il modo complicato : se si prevede che JMP mostri gli aggiornamenti nelle finestre di proprietà di JMP Mentre viene eseguito il programma esterno, dovrai elaborare il testo ReadFunction con JSL che reagisce al testo. Ciò è complicato perché il testo può arrivare con pochi caratteri alla volta; avrai bisogno di una strategia per raccogliere i frammenti di testo in una stringa JSL e determinare quando il comando di testo è completo e non buttare via parte del Prossimo comando di testo. I dati che JMP può visualizzare possono trovarsi nel testo o in un file, ma il comando di testo ricevuto consente di sapere se i dati sono disponibili. (Non consiglio di attendere che un file diventi disponibile perché potresti iniziare a utilizzare un file scritto solo a metà dal programma esterno.)
Scrivere la ReadFunction affinché funzioni bene: prova qualcosa del genere:
while(this<<CANREAD></CANREAD>
IL processi usi della funzione tuo strategia per determinare se il buffer contiene uno o più comandi di testo completi, elabora i comandi, rimuove i comandi e restituisce tutto ciò che è rimasto nel buffer che diventerà parte del successivo comando di testo. Tieni presente che process(buffer) dovrebbe restituire l'intero buffer invariato se il comando non è completo e dovrebbe elaborare tutti i comandi di testo nel buffer che sono completi.
E, in tutta la parte complicata di cui sopra, ho completamente ignorato il modo in cui deve essere scritto il programma esterno per generare l'output stampato che JMP può interpretare come comandi di testo. E come potrebbe essere una strategia: nuove righe o virgole o ecc. per delimitare i comandi completi.