使用 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 可以将其解释为文本命令的打印输出。 策略可能是什么样的:换行符或逗号等来分隔完整的命令。