D
diablo80
Gast
Hallo,
ich habe folgendes Problem:
ich habe mir eine eigene Console in mein Programm gebaut und lasse dort out und err von externen Anwendungen ausgeben. nun habe ich verschiedene Button auf meiner Oberfläche, die die verschiedenen externen Anwendungen starten. Die externen Anwendungen können/dürfen nicht gleichzeitig laufen. Wenn ich jetzt Button A drücke, soll Anwendung A gestartet werden und all anderen Buttons disabled werden. Wenn die Anwendung und Ausgabe fertig ist sollen wieder alle Buttons enabled werden. Bei Button B genau dasselbe. Bei Button C ist eine Besonderheit, da des externe Programm Ausgaben immer in unterschiedlichen Zeitschritten macht (habe ich keinen Einfluß drauf) und u.U. extrem lange laufen kann. Die Ausgaben des externen Programms werden immer wieder unterbrochen. Daher kann ich nicht sagen, ob das externe Programm gerade fertig ist oder bloß etwas länger bis zum nächsten Ausgabeschritt braucht, weshalb ich auch nicht sagen kann ob meine Buttons nun disabled bleiben müssen oder ich sie auf enabled setzen muss. Des Weiteren muss auch darauf geachtet werden, ob ein Fehler auftritt oder das externe Programm normal durchläuft.Nachfolgend mal mein Versuch das ganze zu Programmieren:
PS: ich hoffe es sieht jemand hier durch, der Code wurde von mir nun schon so oft umgebaut, das er sehr durcheinander wirkt, sorry.
p ist die Variable vom Typ Process mit der die externe Anwendung angesprochen werden kann.
wird zur Initialisierung einmal aufgerufen:
dann folgendes in der run()
aufgerufen wird das ganze beim Drücken der Buttons, hier mal für Button A
ich habe folgendes Problem:
ich habe mir eine eigene Console in mein Programm gebaut und lasse dort out und err von externen Anwendungen ausgeben. nun habe ich verschiedene Button auf meiner Oberfläche, die die verschiedenen externen Anwendungen starten. Die externen Anwendungen können/dürfen nicht gleichzeitig laufen. Wenn ich jetzt Button A drücke, soll Anwendung A gestartet werden und all anderen Buttons disabled werden. Wenn die Anwendung und Ausgabe fertig ist sollen wieder alle Buttons enabled werden. Bei Button B genau dasselbe. Bei Button C ist eine Besonderheit, da des externe Programm Ausgaben immer in unterschiedlichen Zeitschritten macht (habe ich keinen Einfluß drauf) und u.U. extrem lange laufen kann. Die Ausgaben des externen Programms werden immer wieder unterbrochen. Daher kann ich nicht sagen, ob das externe Programm gerade fertig ist oder bloß etwas länger bis zum nächsten Ausgabeschritt braucht, weshalb ich auch nicht sagen kann ob meine Buttons nun disabled bleiben müssen oder ich sie auf enabled setzen muss. Des Weiteren muss auch darauf geachtet werden, ob ein Fehler auftritt oder das externe Programm normal durchläuft.Nachfolgend mal mein Versuch das ganze zu Programmieren:
PS: ich hoffe es sieht jemand hier durch, der Code wurde von mir nun schon so oft umgebaut, das er sehr durcheinander wirkt, sorry.
p ist die Variable vom Typ Process mit der die externe Anwendung angesprochen werden kann.
wird zur Initialisierung einmal aufgerufen:
Code:
public void output()
{
try
{
PipedOutputStream pout=new PipedOutputStream(this.pin);
System.setOut(new PrintStream(pout,true));
}
catch (java.io.IOException io)
{
textArea.append("Couldn't redirect STDOUT to this console\n"+io.getMessage());
}
catch (SecurityException se)
{
textArea.append("Couldn't redirect STDOUT to this console\n"+se.getMessage());
}
try
{
PipedOutputStream pout2=new PipedOutputStream(this.pin2);
System.setErr(new PrintStream(pout2,true));
}
catch (java.io.IOException io)
{
textArea.append("Couldn't redirect STDERR to this console\n"+io.getMessage());
}
catch (SecurityException se)
{
textArea.append("Couldn't redirect STDERR to this console\n"+se.getMessage());
}
quit=false;
reader=new Thread(this);
reader.setDaemon(true);
reader.start();
reader2=new Thread(this);
reader2.setDaemon(true);
reader2.start();
processThreadOut=new Thread(this);
processThreadOut.setDaemon(true);
processThreadOut.start();
processThreadErr=new Thread(this);
processThreadErr.setDaemon(true);
processThreadErr.start();
}
dann folgendes in der run()
Code:
public synchronized void run()
{
try
{
while (Thread.currentThread()==reader)
{
try { this.wait(100);}catch(InterruptedException ie) {}
if (pin.available()!=0)
{
String input=this.readLine(pin);
textArea.append(input);
textArea.setCaretPosition(textArea.getText().length());
}
if (quit) return;
}
while (Thread.currentThread()==reader2)
{
try { this.wait(100);}catch(InterruptedException ie) {}
if (pin2.available()!=0)
{
String input=this.readLine(pin2);
textArea.append(input);
textArea.setCaretPosition(textArea.getText().length());
}
if (quit) return;
}
while (Thread.currentThread()==processThreadOut)
{
try { this.wait(100);}catch(InterruptedException ie) {}
if (p != null) {
if(stdInput.available() != 0){
String input=this.readLine(stdInput);
System.out.println(input);
}
}
}
while (Thread.currentThread()==processThreadErr)
{
try { this.wait(1000);}catch(InterruptedException ie) {}
if (p != null){
if ((stdError.available() != 0)&&(stdInput.available() == 0)) {
String input=this.readLine(stdError);
System.err.println(input);
error = true;
}
/* else
if (error)
try{
p.waitFor();
p = null;
error = false;
releaseAllComponents(); //alle Buttons enabled
}
catch(InterruptedException e)
{}
else
{
if(imageToFoamClicked&&(stdInput.available() == 0))
{
try{
p.waitFor();
p = null;
imageToFoamClicked = false;
releaseAllComponents();
}
catch(InterruptedException e)
{}
}
if(foamToImageClicked)
{
p.waitFor();
p = null;
foamToImageClicked = false;
releaseAllComponents();
}
}*/
}
}
} catch (Exception e)
{
textArea.append("\nConsole reports an Internal error.");
textArea.append("The error is: "+e);
}
}
aufgerufen wird das ganze beim Drücken der Buttons, hier mal für Button A
Code:
....
lockAllComponents(); //alle Buttons disabled
rt = Runtime.getRuntime();
try{
p = rt.exec("....");
stdInput = (p.getInputStream());
stdError = ( (p.getErrorStream()));
}
.....