最終的に、JP1みたいなものを作りたいので、
外部ファイル(ここではバッチファイル)を実行する練習をしてみました。
バッチファイルは、echo とかしてるだけです。
単純に動かしたいだけなら、exec関数、
終わったのかまだ続いてるのか、様子を見たいなら、pipeexec関数を使用します。
exec関数だけだとあっさり終わってしまうので
合わせて載せます。
------
; バッチプログラムを動かす
#include "hspext.as"
button gosub "exec", *ExecBat
button gosub "pipeexec", *PipeExecBat
stop
; 通常の実行
*ExecBat
exec "test.bat"
retVal = stat
mes stat
return
; パイプ付き実行
*PipeExecBat
sdim buf, 32000
pipeexec buf, "test.bat"
repeat
pipeget buf
if stat=0 : break
// mes buf
wait 50
// pipeput 1
loop
pos 100, 100
mes "終わり"
return
----
execでも、pipeexecでも、同期実行というのはナシみたいです。
(Version3より前はあったみたい)
なので、蹴っ飛ばして戻ってくる感じですね。
蹴っ飛ばした先が重い処理の場合でも、
HSPへコントロールが戻ってくる。
それはそれでいいのだけども、
その先を見ていたいのです。
終わったのか、まだやってるのか。
なので、execだけでは物足りず、pipeexecを使うことになりそうです。
さてpipeexec。
そもそもpipeと言うのは何かと言うと、
HSPが蹴っ飛ばした外部ファイル(ここではバッチプログラム)が
別プロセスで動いていて、
そこの様子を見るために、通信用のパイプをつなげるという意味です。(たぶん)
イメージは・・・潜水艦(プログラム)同士をゴムホース(パイプ)でつないで声を通す・・みたいな!?
pipeexec実行時に、パイプを指定し、実行します。
そうすると、走り始めます。
HSPからは、ちょっとしてから、pipegetで様子を伺います。
終わったよとか、まだやってるよとかのステータスを得ます。
終わってたら、repeatを抜けて終了。
コメントアウトしてあるのは実験コード。
bufには、標準出力が入ってました。
pipeoutは、標準入力です。
さらに実験
①バッチファイルでpauseして、その状態でタスクマネージャーからcmd.exeを殺してみた
stat=0になって、"終わり"が出た
⇒ 強制終了等で死んでも見失わず(?)終了と判断できる。OK。
②バッチファイルでpauseして、その状態でHSPのダイアログを閉じてみた
タスクマネージャー上のcmd.exeも死んだ
⇒ 子プロセスの掃除をしてる。OK。