バッチプログラムを動かす | HotSoupProcessorの記録

HotSoupProcessorの記録

コンピューター言語 HotSoupProcessor の練習記録です

最終的に、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。