Hallo,
Ich bin ein neuer Benutzer und würde gerne ein paar Dinge über Run Program wissen, die mir aus dem nicht klar waren
Dokumentation. Ich verwende JSL, um ein externes Programm auszuführen, das seine eigene GUI startet.
1. Gibt es eine Möglichkeit, diese GUI in JMP einzubetten oder zu erzwingen, dass sie in der JMP-GUI enthalten ist?
2. Es startet zunächst eine Befehlszeile unter Windows und lädt Sachen und fragt dann nach einem Dateidialog, der
Für mich ist es eine Standarddatei. Ist es möglich, dies automatisch bereitzustellen und das Öffnen des Dateidialogs zu unterdrücken?
3. Es wurden Matlab-Diagramme generiert, wie sie in Matlab geschrieben sind. Kann ich erzwingen, dass die Matlab-Plots in der JMP-GUI enthalten sind?
4. Das Wichtigste: Ich kann das externe Programm aufrufen, aber der Skriptteil nach „Run Program“ wird ausgeführt
auch wenn das Programm noch nicht beendet ist. Da ich Dateien kopieren muss, nachdem das externe Programm beendet ist, die kopierten Dateien
sind unvollständig.
Ich versuche Folgendes zu tun (Korrekturen sind willkommen):
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?");
Vielen Dank für eine ausführliche Antwort. Das Problem ist, dass ich keine Textausgabe sehe. Ich hatte gehofft, dass es eine Möglichkeit gäbe, die UI-Fenster einzudämmen
wie Matlab-Plots, die vom externen Programm erstellt und aktiv aktualisiert werden. Das externe Programm stoppt einfach mit dem letzten sichtbaren Plot und ich muss es manuell schließen. Aber das Erfassen eines UI-Fensters und das Einfügen in jmp ist meiner Meinung nach zu viel verlangt von einer Anwendung.
Danke
Antwort (4): Warum wird JSL nach dem RunProgram-Aufruf zu früh ausgeführt?
RunProgram kann auf verschiedene Arten gestartet werden. Da Sie eine ReadFunction bereitgestellt haben, kehrt RunProgram sofort zurück und übergibt ein RunProgram-Objekt mit Methoden, die Sie testen können:
While( run_program << canread | run_program << canwrite | !(run_program << isreadeof),
// show(run_program<<CANREAD></CANREAD>
Das obige Beispiel hängt davon ab, dass das externe Programm die Verbindung schließt, wenn sie beendet wird. Nach jeder Überprüfung wartet es kurz und prüft dann erneut, ob das Programm noch verfügbar ist, darauf wartet, von JMP zu lesen, in JMP zu schreiben oder einfach die Verbindung nicht geschlossen hat, von der JMP später möglicherweise lesen kann. Die kommentierte show() hilft dabei, es herauszufinden.
Ein einfacherer Ansatz besteht darin, die ReadFunction wegzulassen. Dann gibt RunProgram einfach den Text zurück, den das externe Programm ausgegeben hat. nach Das externe Programm wird beendet. Anschließend können Sie den zurückgegebenen Text und alle Dateien verarbeiten, die das externe Programm mit JSL erstellt hat (um Fenster zu öffnen, Diagramme zu erstellen usw.).
Der komplizierte Weg : Wenn Sie erwarten, dass JMP Updates in JMP-eigenen Fenstern anzeigt während Wenn das externe Programm ausgeführt wird, müssen Sie den ReadFunction-Text mit JSL verarbeiten, das auf den Text reagiert. Dies ist kompliziert, da der Text mehrere Zeichen gleichzeitig enthalten kann. Sie benötigen eine Strategie zum Sammeln der Textteile in einem JSL-String und zum Bestimmen, wann der Textbefehl abgeschlossen ist, ohne einen Teil davon wegzuwerfen nächste Textbefehl. Die Daten, die JMP anzeigen soll, können entweder im Text oder in einer Datei vorliegen, aber anhand des empfangenen Textbefehls wissen Sie, dass die Daten verfügbar sind. (Ich empfehle nicht, darauf zu achten, dass eine Datei verfügbar wird, da Sie möglicherweise eine Datei verwenden, die vom externen Programm nur zur Hälfte geschrieben wurde.)
Schreiben Sie die ReadFunction so, dass sie gut funktioniert: Versuchen Sie etwas wie Folgendes:
while(this<<CANREAD></CANREAD>
Die Verfahren Funktion verwendet dein Strategie, um festzustellen, ob der Puffer einen oder mehrere vollständige Textbefehle enthält, verarbeitet die Befehle, entfernt die Befehle und gibt alles zurück, was im Puffer übrig bleibt und Teil des nächsten Textbefehls wird. Beachten Sie, dass „process(buffer)“ den gesamten Puffer unverändert zurückgeben sollte, wenn der Befehl nicht abgeschlossen ist, und alle Textbefehle im Puffer verarbeiten sollte, die abgeschlossen sind.
Und bei all dem oben genannten komplizierten Teil habe ich völlig ignoriert, wie das externe Programm geschrieben werden muss, um die gedruckte Ausgabe zu generieren, die JMP als Textbefehle interpretieren kann. Und wie eine Strategie aussehen könnte: Zeilenumbrüche oder Kommas usw., um vollständige Befehle abzugrenzen.