Hallo!
Ich habe ein Problem bei der Kommunikation mit einem aus Java heraus gestarteten Prozess über die Standardein- und ausgabe. Ich weiß, dass es dazu in diesem Forum eine Menge Beiträge gibt und ich habe mich schon durch sehr viel durchgewühlt. Leider löst keiner dieser Beiträge mein Problem.
Also, zu meinem Problem:
Ich habe ein kleines Testprogramm geschrieben, das einen Prozess startet. Anschließend holt es sich die Standardein- und ausgabestreams dieses Prozesses und startet 2 Hintergrundthreads. Einer fragt ständig den Inputstream ab, der andere den Errorstream. Aus Performancegründen habe ich Wartezeiten von 10ms eingebaut. Die Ergebnisse schreiben die Threads in ein Textfeld.
Über einen Send-Button wird andererseits ein String an den Outpustream des Prozesses gesendet. Auf diese Weise will ich mit dem Prozess kommunizieren.
Als Prozess habe ich mir in C 3 kleine Testprozesse geschrieben, bei denen das Javaprogramm stets unterschiedlich reagiert:
1. Der Prozess gibt in einer Endlosschleife etwas in die Standardausgabe aus.
Bei diesem Prozess funktioniert es, wie es soll. D.h. die Ausgabe des Prozesses erscheint im Textfeld der
Javaanwendung. Aufgrund der Endlosschleife ist der Prozessor natürlich voll ausgelastet
2. Wie bei 1., nur dass hier in jeder Iteration ein Sleep(11) eingebaut ist, so dass der Prozess nicht so viele
Ressourcen schluckt.
Hier funktioniert es leider nicht. Die Ausgabe des Prozesses erscheint nicht in dem Textfeld.
3. Dieser Prozess wartet auf eine Eingabe von der Standardeingabe. Anschließend wird ein Beep-Ton ausgegeben und
danach wird etwas auf der Standardausgabe ausgegeben. Dies passiert ebenfalls in einer Schleife.
Hier funktioniert nur das Senden an den Prozess. Denn nach dem Betätigen von "Send" ertönt der Beep-Ton. Es
erscheint jedoch keine Ausgabe im Textfeld.
Ich bin mit meinem Latein am Ende und weiß leider nicht mehr, woran es liegen könnte. Vielleicht kann mir ja jemand helfen.
Hier ein wenig Code:
Danke schonmal im voraus!
Ich habe ein Problem bei der Kommunikation mit einem aus Java heraus gestarteten Prozess über die Standardein- und ausgabe. Ich weiß, dass es dazu in diesem Forum eine Menge Beiträge gibt und ich habe mich schon durch sehr viel durchgewühlt. Leider löst keiner dieser Beiträge mein Problem.
Also, zu meinem Problem:
Ich habe ein kleines Testprogramm geschrieben, das einen Prozess startet. Anschließend holt es sich die Standardein- und ausgabestreams dieses Prozesses und startet 2 Hintergrundthreads. Einer fragt ständig den Inputstream ab, der andere den Errorstream. Aus Performancegründen habe ich Wartezeiten von 10ms eingebaut. Die Ergebnisse schreiben die Threads in ein Textfeld.
Über einen Send-Button wird andererseits ein String an den Outpustream des Prozesses gesendet. Auf diese Weise will ich mit dem Prozess kommunizieren.
Als Prozess habe ich mir in C 3 kleine Testprozesse geschrieben, bei denen das Javaprogramm stets unterschiedlich reagiert:
1. Der Prozess gibt in einer Endlosschleife etwas in die Standardausgabe aus.
Bei diesem Prozess funktioniert es, wie es soll. D.h. die Ausgabe des Prozesses erscheint im Textfeld der
Javaanwendung. Aufgrund der Endlosschleife ist der Prozessor natürlich voll ausgelastet
2. Wie bei 1., nur dass hier in jeder Iteration ein Sleep(11) eingebaut ist, so dass der Prozess nicht so viele
Ressourcen schluckt.
Hier funktioniert es leider nicht. Die Ausgabe des Prozesses erscheint nicht in dem Textfeld.
3. Dieser Prozess wartet auf eine Eingabe von der Standardeingabe. Anschließend wird ein Beep-Ton ausgegeben und
danach wird etwas auf der Standardausgabe ausgegeben. Dies passiert ebenfalls in einer Schleife.
Hier funktioniert nur das Senden an den Prozess. Denn nach dem Betätigen von "Send" ertönt der Beep-Ton. Es
erscheint jedoch keine Ausgabe im Textfeld.
Ich bin mit meinem Latein am Ende und weiß leider nicht mehr, woran es liegen könnte. Vielleicht kann mir ja jemand helfen.
Hier ein wenig Code:
Code:
public class Prozesstest
extends JFrame
{
//Textfelder für Ein- und Ausgabe
JTextArea InputText;
JTextField OutputText;
//Prozess- und Threadvariablen
Process proc;
InputThread inputthread;
InputThread errorthread;
//Streams zur Kommunikation mit dem Prozess
BufferedReader input;
BufferedReader error;
PrintStream output;
public Prozesstest()
{
//GUI bauen
super("Prozesstest");
setLocation(200,200);
setSize(640,480);
setVisible(true);
Container CPane = getContentPane();
CPane.setLayout(new FlowLayout(FlowLayout.LEFT));
//Inputextfeld bauen, scrollbar
InputText = new JTextArea(20,55);
JScrollPane scroll = new JScrollPane(InputText);
//InputText.setBorder(BorderFactory.createEtchedBorder());
CPane.add(scroll);
//Outputtextfeld bauen
OutputText = new JTextField(55);
OutputText.setBorder(BorderFactory.createEtchedBorder());
CPane.add(OutputText);
//Button zum Senden an den Prozess
JButton button = new JButton("Send");
button.addActionListener(new Event());
CPane.add(button);
CPane.doLayout();
addWindowListener(new WindowClosingAdapter());
}
public void StartProcess(String cmd)
{
try
{
//Starten des externen Prozesses
proc = Runtime.getRuntime().exec(cmd);
//Steams erzeugen
input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
error = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
output = new PrintStream(new BufferedOutputStream(proc.getOutputStream()), true);
//Inputthread starten
inputthread = new InputThread(input);
inputthread.run();
//Errorthread starten
errorthread = new InputThread(error);
errorthread.run();
}
catch(IOException e)
{
System.out.println("Fehler beim starten des Prozesses");
}
}
/**
* @param args
*/
public static void main(String[] args)
{
//Instanz der Gui erzeugen
Prozesstest ptest = new Prozesstest();
//Prozess starten
ptest.StartProcess("TestProzess2.exe");
}
class WindowClosingAdapter
extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
try
{
//Inputthread beenden
if(inputthread != null)
{
inputthread.interrupt();
inputthread.join();
}
//Errorthread beenden
if(errorthread != null)
{
errorthread.interrupt();
errorthread.join();
}
//Process zerstören
if(proc != null)
{
proc.destroy();
}
}
catch(Exception ex)
{
System.out.println("Fehler beim Schließen");
}
System.exit(0);
}
}
class Event
implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("Send"))
{
try
{
//"hallo" an den Prozess senden
output.println("hallo");
}
catch (Exception e1)
{
System.out.println("Fehler beim Senden an den Prozess");
}
}
}
}
class InputThread
extends Thread
{
//Zu überwachender Stream
BufferedReader buffer;
public InputThread(BufferedReader b)
{
buffer = b;
}
public void run()
{
try
{
//Für immer, wenn der Thread nicht beendet wird
while(isInterrupted() == false)
{
//Solange etwas im Buffer ist und der Thread nicht beendet wird
while(isInterrupted() == false && buffer.ready())
{
//Inhalt im Textfeld ausgeben
InputText.append(buffer.readLine());
InputText.append("\n");
}
//10ms warten, wegen der Performance
sleep(10);
}
//Buffer schließen
buffer.close();
}
catch(Exception e)
{
System.out.println("Fehler beim Thread");
}
}
}
}
Danke schonmal im voraus!