Habe folgendes Problem:
In einer GUI Anwendung wird der Button “Messen” geclickt, daraufhin wird eine Klasse MeasuremntStarter ausgeführt die eine *.exe startet. Die *.exe ermittelt Messwerte und wird im Anschluss terminiert. Bis hier hin scheint alles gut zu sein.
Da allerdings das ausführen der *.exe ein paar Sekunden dauert würde ich gerne für diese Zeit ein kleines “Bitte Warten” JWindow in der GUI Anwendung einblenden. Hier liegt das Problem, das klappt nicht so ganz. Sprich das JWindow wird nicht sauber dargestellt. Eagle hat gemeint das ganze könnte man mit Thread(s) lösen, nur bin ich mir nicht ganz im klaren wie ich das hier mache:
public class GUI_Anwendung{
...
//wenn Messen gedrückt:
bitteWartenWindow.setVisible(true);
new MeasurementStarter();
bitteWartenWindwo.setVisible(false);
...
Die Klasse startet die *.exe:
import java.io.IOException;
public class MeasurementStarter {
private static String C_PROGRAMM="M1.exe";
public MeasurementStarter(){
try {
MeasurementStarter.startMeasurement();
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
public static void startMeasurement() throws IOException {
System.out.println("M1.exe wird gestartet...");
Runtime rt=Runtime.getRuntime();
Process proc=null;
try {
proc=rt.exec(C_PROGRAMM);
proc.getOutputStream().close();
int ret=proc.waitFor();
if(ret!=0) {
throw new IOException(C_PROGRAMM+" returned "+ret);
}
}
catch(InterruptedException ie) {
throw new IOException(C_PROGRAMM+" Interrupted during call");
}
finally {
if(proc!=null) {
proc.destroy();
}
}
}
}
Ach ja, was mir noch aufgefallen ist, wenn ich “Messen” geclickt habe, scheint die GUI Anwendung so lange blockiert zu sein bis die *.exe wieder terminiert. Sprich der Button “Messen” bleibt in dieser Zeit auch hängen!
Schreib mal deine Klassen besser, d.h. nicht alles im Konstruktor machen und nicht alles als statische Methoden machen und wozu fängst du die Exception ab um nur eine neue zu machen die du auch nur ausgibst?
Damit du das schön mit Threads machen kannst leitest du einfach von Thread ab
import java.io.IOException;
public class MeasurementStarter extends Thread{
private static String C_PROGRAMM="M1.exe";
public void run(){
try{
System.out.println("M1.exe wird gestartet...");
Runtime rt=Runtime.getRuntime();
Process proc=null;
proc=rt.exec(C_PROGRAMM);
proc.getOutputStream().close();
int ret=proc.waitFor();
if(ret!=0) {
throw new IOException(C_PROGRAMM+" returned "+ret);
}
}
catch(Exception ie) {
ie.printStackTrace();
}
finally {
if(proc!=null) {
proc.destroy();
}
}
}
}
public class GUI_Anwendung{
...
//wenn Messen gedrückt:
bitteWartenWindow.setVisible(true);
MeasurementStarter ms = new MeasurementStarter();
ms.start();
bitteWartenWindwo.setVisible(false);
...
Jetzt hast du nur noch das Problem das dein Fenster sofort weggeht, ich glaub ein join() statt start() könnte helfen bin mir aber nicht 100%ig sicher.
Threads sind schon etwas komplexer und die sollte man vorher einplanen, eine Anwendung auf Threads umbauen ist nicht so einfach.
Hm, ok. Aber ich glaube jetzt gibt es anderweitig Probleme! Die Java GUI_Anwendung darf ja auf der anderen Seite ja erst weitermachen wenn die *.exe fertig/terminiert ist, da diese ja eine txt schreibt die dann wiederum in die GUI_Anwendung eingelesen wird!?
Dann hast du ein Problem
ich glaub du kannst irgendwie abfragen ob das Programm fertig ist was du ausgeführt hast, das musst du dann halt in einer Schleife machen.
Bullzeye hier gehts darum das man programme eigendlich nicht aus dem EDT herausstarten darf, also der Thread der die GUI zeichnet.
Weiterhin darf ich zu der lösung von eagleye bemerken das es besser ist die Streams aus dem externen prozess zu lesen, da diese gepuffert sind und volllaufen können würde das zu problmen führen. Sowas kennt leider kaum einer, also merken