- PR -

外部プログラム実行時の入力待ち検出

投稿者投稿内容
ぐっち
会議室デビュー日: 2007/07/25
投稿数: 17
投稿日時: 2007-08-10 16:32
遅くなりましてすみません。
あしゅさん、ありがとうございます。

これでできそうな気がします。
いろいろやってみようと思います。

またまた質問なのですが、

public void run() {
 while (true) {
  ストリーム.read(出力データ)
  if (ストリームの終端に達した) {
   スレッドを終了する
  } else {
   // 読み込んだデータをイベント処理スレッドに
   // イベントとして通知して画面に表示させる
   外部プロセス出力表示イベントを通知(出力データ)
  }
 }
}

の部分でread()を使うと思うのですが、
ここでブロックされると、プログラムがここで止まって、
外部プロセスへのイベント通知まで実行されないということはないのでしょうか?
read()がブロックしてもそれ以降のif文が実行されないとコンソール的にはならないと思ったのですが、どうなんでしょうか?
どうでしょうかよろしくお願いいたします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-08-10 16:53
入力があった場合だけifに到達すればいいのだから
ブロックしても問題ないでしょう?
ぐっち
会議室デビュー日: 2007/07/25
投稿数: 17
投稿日時: 2007-08-10 18:59
nagiseさん。

プロセスが出力を出して、その出力を見て、入力を行うというケースを考えているのですが、大丈夫なんでしょうか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-08-10 19:25
引用:

ぐっちさんの書き込み (2007-08-10 18:59) より:
プロセスが出力を出して、その出力を見て、入力を行うというケースを考えているのですが、大丈夫なんでしょうか?



心配していることは何ですか?
マズイと思う部分を述べてください。
漠然と不安というのでは議論にもなりませんので。

入力を専門で行うスレッド、出力を専門で行うスレッドがあって
何がマズイと思うのでしょうか?
ぐっち
会議室デビュー日: 2007/07/25
投稿数: 17
投稿日時: 2007-08-13 01:06
入力専門のスレッドと出力専門のスレッドを動かすのは分かるのですが、出力専門のスレッドの方でread()を行いブロックされた場合、スレッドを使っているので、入力は行えると思うのですが、if文に到達してそこまでの出力を表示してくれないとコンソール的にはならないと思ったので、できるのかなぁ?と思った次第です。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-08-13 11:45
引用:

if文に到達してそこまでの出力を表示してくれないとコンソール的にはならないと思ったので、できるのかなぁ?と思った次第です。



3週間経っても文章ではしっくりしない場合は、実際に実装してから悩んだ方が
良いかと。いくらしっくりしても実装が正しくできるわけでは無いですし。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-08-13 15:46
引用:

ぐっちさんの書き込み (2007-08-13 01:06) より:
出力専門のスレッドの方でread()を行いブロックされた場合、スレッドを使っているので、入力は行えると思うのですが、if文に到達してそこまでの出力を表示してくれないとコンソール的にはならないと思ったので、できるのかなぁ?と思った次第です。



書き込むべき文字列がストリームに書き出されるまでブロックするんでしょう?
ブロックしなかったとして書き出される文字列がない場合に次のif文に行って何するの?
出力する情報がないから何もしないで戻ってきてまたストリームから値を読み込んで…
って無駄にぐるぐる回るの?

フローチャートでも描いてみれば納得できるのかな?
ぐっち
会議室デビュー日: 2007/07/25
投稿数: 17
投稿日時: 2007-08-16 15:39
read()はストリームが終端に達するまでブロックするんですよね?
それだと、プロセスが途中までしか出力していないときにはif文に達しなく、プロセス出力を表示用スレッドにも渡せずに、結局表示できないのではないかと思っているのすがおかしいでしょうか?

とりあえず実際にプロセスの出力を表示するだけのプログラムを作ってみようとしたのですが、ブロックされてしまいます。どうすればいいんでしょう?

import java.util.*;
import java.io.*;

public class aaa{
public static void main(String[] args){
try{
Process p=Runtime.getRuntime().exec("c:\\Perl\\bin\\perl test.pl");
InputStream is=p.getInputStream();
InputStream es=p.getErrorStream();
OutputStream os=p.getOutputStream();
Write w=new Write();
Read r=new Read(is,w);
r.start();
w.start();

}catch(IOException e){
e.printStackTrace();
}
}
}


class Write extends Thread{
Read r;
byte[] buff=new byte[16];
public void run(){
while(true){
if(buff!=null){
String str=new String(buff);
System.out.println(str);
}
}
}
}

class Read extends Thread{
InputStream is;
InputStreamReader isr;
BufferedReader br;
byte[] buff=new byte[1024];
int n;
Write w;
Read(InputStream is,Write w){
this.is=is;
this.w=w;
isr=new InputStreamReader(is);
br=new BufferedReader(isr);
}
public void run(){
while(true){
try{
is.read(w.buff);
System.out.println("read");
}catch(Exception e){
e.printStackTrace();
}
}
}
}

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