JMPで外部プログラムを実行するやあ、
私は新しいユーザーであり、Run Program についていくつかのことを知りたいと思っています。
ドキュメンテーション。 JSL を使用して、独自の GUI を起動する外部プログラムを実行しています。
1. この GUI を JMP に埋め込む方法や、強制的に JMP GUI に含める方法はありますか?
2. 最初に Windows でコマンド ラインを開始し、内容をロードしてから、ファイル ダイアログを要求します。
私にとっては標準ファイルです。 これを自動的に提供して、ファイルダイアログを開くのを抑制することは可能ですか?
3. matlab で書かれているように、matlab プロットを生成しました。 matlab プロットを強制的に JMP GUI に含めることはできますか?
4. 最も重要: 外部プログラムを呼び出すことはできますが、Run Program が実行された後のスクリプト部分です。
プログラムが終了していなくても。 外部プログラムの終了後にファイルをコピーする必要があるため、コピーされたファイルは
不完全です。
私はこれをやろうとしています(修正は大歓迎です):
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?");
Re: JMPで外部プログラムを実行する詳細な返信ありがとうございます。 問題は、テキスト出力を見ていないことです。 UIウィンドウを含める方法があればと思っていました
外部プログラムによって作成され、積極的に更新される matlab プロットなど。 外部プログラムは、表示されたままの最後のプロットで停止するだけで、手動で閉じる必要があります。 しかし、UIウィンドウをキャプチャしてjmp内に配置することは、アプリケーションに求めるには多すぎると思います。
ありがとう
Re: JMPで外部プログラムを実行する(4) に答えて、RunProgram 呼び出しの後で JSL がすぐに実行されるのはなぜですか?
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 がテキスト コマンドとして解釈できる印刷出力を生成するために外部プログラムをどのように作成する必要があるかを完全に無視しました。 そして、戦略がどのように見えるか:完全なコマンドを区切るための改行またはコンマなど。