- PR -

Scalaのactorについて

1
投稿者投稿内容
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2008-07-26 16:53
 最近、関数型言語を勉強し始めたので、ここに書いたのでいいのでしょうか?
言語:Scala
わからないこと:actorを強制終了させる方法

 下のプログラムでJDKのjrunscriptなどを
  scala Execution jrunscript
と動作させると、子プロセスで動作するjrunscriptがそのまま動作しますが、
  js > exit();
で終了させると、キー入力待ちが残って、改行などを入力しないとプログラムが終了しません。
 下のif (Console.in.ready()) {などのコメントをはずすとexit();で終了したあと
キー入力待ちにならないで終了できるのですが、途中の入力文字が改行で確定するまで見えないのでそうすることはできません。
 watcherからinputterへのlinkなどを設定してみても現象は同じようです。
 したがって、inputterを強制終了させるのかなと思っています。


コード:
import scala.actors.Actor._;

object Execution {
  val b = new Array[byte](0x2000);
  object end;
  def watch() {
    loop {
      react {
        case ins : java.io.InputStream =>
          if (ins.available()>0) {
            val n = ins.read(b);
            print(new String(b, 0, n));
          }
          self ! ins;

        case end =>
          println("end watch!");
          exit("watch");
      }
    }
  }
  def input() {
    loop {
      receive {
        case out:java.io.PrintWriter =>
//          if (Console.in.ready()) {
            out.println(Console.readLine);
            out.flush();
//          }
          self ! out;

        case end =>
          println("end input!");
          exit("input");
      }
    }
  }

  def main(args :Array[String]): Unit = {
    val startTime = System.currentTimeMillis();
    val parameters = new java.util.ArrayList[String]();
    parameters.add("cmd");
    parameters.add("/C");
    for (p<-args) parameters.add(p);

    val pb = new ProcessBuilder(parameters);
    pb.redirectErrorStream(true);
    val process = pb.start();

    val watcher = actor(watch());
    val inputter = actor(input());

    watcher ! process.getInputStream();
    inputter ! new java.io.PrintWriter(process.getOutputStream());

    process.waitFor();

    inputter ! end;
    watcher ! end;

    val endTime = System.currentTimeMillis();
    println("main end " + (endTime-startTime) + "(ms)");
  }
}



だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2008-07-30 20:32
 ここの会議に書くべき話題でなかったようですが、とりあえず解決したので書いておきます。
 単純にいえば、キー入力待ちをスレッドで使った場合は、SwingみたいにSystem.exitで終える必要があり、main関数の最後につければ思ったような動作になります。
 単にActor使うだけならKilimでもよかったので、Java Solutionにすべきだったようです。
1

スキルアップ/キャリアアップ(JOB@IT)