使用 JMP 運行外部程序你好,
我是新用戶,想了解一些關於運行程序的事情,這些事情我從
文檔。我正在使用 JSL 運行一個啟動其自己的 gui 的外部程序。
1. 有沒有辦法將此 gui 嵌入到 JMP 中或強制將其包含在 JMP gui 中?
2. 它最初在 Windows 上啟動命令行並加載內容,然後請求一個文件對話框
對我來說是一個標准文件。 是否可以自動提供它並禁止打開文件對話框?
3. 它生成了用 matlab 編寫的 matlab 繪圖。 我可以強制將 matlab 繪圖包含在 JMP gui 中嗎?
4.最重要的是:我可以調用外部程序,但是執行運行程序後的腳本部分
即使程序還沒有完成。 由於我必須在外部程序完成後復製文件,因此復制的文件
是不完整的。
我正在嘗試這樣做(歡迎任何更正):
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?");
回复:使用 JMP 運行外部程序感謝您的詳細回复。 問題是我沒有查看文本輸出。 我希望是否有辦法包含 ui 窗口
例如由外部程序創建和主動更新的 matlab 繪圖。 外部程序只是停止並顯示最後一個圖,該圖仍然可見,我必須手動關閉它。 但是捕獲 ui 窗口並將其放入 jmp 中我想對任何應用程序來說要求太多了。
謝謝
回复:使用 JMP 運行外部程序回答(4),為什麼JSL在RunProgram調用之後運行得太快?
RunProgram 可以通過多種方式啟動。 由於您提供了 ReadFunction,RunProgram 將立即返回並返回一個 RunProgram 對象,該對象具有您可以測試的方法:
While( run_program << canread | run_program << canwrite | !(run_program << isreadeof),
// show(run_program<<CANREAD></CANREAD>
上面的示例取決於外部程序在終止時關閉連接。 每次檢查後,它都會短暫等待,然後再次查看程序是否仍然存在,等待從 JMP 讀取、寫入 JMP,或者只是尚未關閉 JMP 稍後可能能夠讀取的連接。 帶註釋的 show() 將有助於解決這個問題。
一種更簡單的方法是省略 ReadFunction。 然後 RunProgram 只返回外部程序打印的文本,後外部程序完成。 然後,您可以處理返回的文本以及外部程序使用 JSL 創建的任何文件(以打開窗口、製作圖表等)
複雜的方式:如果您希望 JMP 在 JMP 擁有的窗口中顯示更新儘管當外部程序運行時,您需要使用對文本做出反應的 JSL 來處理 ReadFunction 文本。 這很複雜,因為文本一次可以到達幾個字符;您需要一種策略來將文本位收集到 JSL 字符串中並確定文本命令何時完成並且不丟棄部分文本下一個文本命令。 JMP 要顯示的數據可以在文本中,也可以在文件中,但通過接收的文本命令您可以知道數據是否可用。 (我不建議監視文件變得可用,因為您可能會開始使用僅由外部程序寫入一半的文件。)
編寫 ReadFunction 以使其正常工作:嘗試如下操作:
while(this<<CANREAD></CANREAD>
這過程功能用途你的確定緩衝區是否保存完整文本命令、處理命令、刪除命令並返回緩衝區中剩餘的內容(將成為下一個文本命令的一部分)的策略。 請注意,如果命令不完整,則 process(buffer) 應返回整個緩衝區不變,並且應處理緩衝區中完整的所有文本命令。
而且,在上述所有復雜部分中,我完全忽略瞭如何編寫外部程序來生成 JMP 可以將其解釋為文本命令的打印輸出。 策略可能是什麼樣的:換行符或逗號等來分隔完整的命令。