2008年9月30日火曜日

ほぼ日刊xyzzy新聞

タイトルはホッテントリメーカーから。日刊とか無理。

非同期って恐いねというお話。

まずは関数を3つ用意

(defun process-list ()
  "バッファプロセスのリスト."
  (remove-if-not #'processp
                (mapcar #'buffer-process (buffer-list))))

(defun running-process-exist-p ()
  "動作中のプロセスがあるか."
  (some #'(lambda (pid)
            (case (process-status pid)
              (:run t)
              (:exit nil)))
        (process-list)))

(defun kill-all-subprocess ()
  "バッファプロセスをすべて殺す."
  (every #'kill-process (process-list)))

次に何かxyzzyからプロセスを走らせる(M-x: shell とか)

で、ここで上の関数を使って動作中のプロセスをすべて消したいわけです。 別にタイミングを気にしなければ (kill-all-subprocess) だけでも良いんだ ろうけど、ちょっと時間差が気になるコードを書いていたのでこんなS式を書 いてみた。

これならloopフォームを抜けたときには動作しているプロセスが完全になくな っているはず。

(loop (if (running-process-exist-p)
          (kill-all-subprocess)
        (return t)))

意気揚々と実行(C-x C-e)。確かにプロセスは消えた。そこまではいいけど...

何故かxyzzy本体まで落ちた。

...

あるえー(・3・)

とりあえず次ので解決したことにしておく


(loop (if (running-process-exist-p)
       (and (kill-all-subprocess)
            (sleep-for 0.5))
     (return t)))

0 件のコメント:

コメントを投稿