Swing ProgressMonitor & Perl

zdrel

Mitglied
Hi, Leute! Kann mir jemand vielleicht mit dem ProgressMOnitor helfen? Ich moechte einfach ein Perl Skript ausfuehren mit dem Knopfdruck und waehrend Ausfuehrung soll ProgressMonitor den Fortschritt anzeigen. HAbe schon Menge recherchiert, trotzdem bei der Ausfuehrung haengt mein Program!!! Und zwar richtig - muss dann manuell den PC neustarten!

Hier ist mein Code:

Java:
 class ExportButtonListener implements ActionListener {

        private Process process;
        int progress = 0;

        public void actionPerformed(ActionEvent e) {

            Thread thread = new Thread(new Runnable() {

                public void run() {
                    final ProgressMonitor pm = new ProgressMonitor(null, "Lade...", "", 0, 100);
                    pm.setMillisToDecideToPopup(0);
                    pm.setMillisToPopup(0);
                    while (!pm.isCanceled() && progress <= pm.getMaximum()) {
                    SwingUtilities.invokeLater(new Runnable() {

                        public void run() {
                            pm.setProgress(progress);
                            pm.setNote(progress + " ... " + " done");
                        }
                    });

                    try {
                        String masterip = _am.getAP().ip.getText();
                        String login = _am.getAP().login.getText();
                        char[] passwort = _am.getAP().password.getPassword();
                        String passwordnew = new String(passwort);
                        String path = _am.getMFP().output.getText();
                        String cmd_ipam = "cmd /c perl F:\\ubuntu\\export_subnets_ip_csv.pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        String cmd_backup = "cmd /c perl F:\\ubuntu\\export_database.pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        String cmd_module = "cmd /c perl F:\\ubuntu\\export_perlmodule.pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        String cmd_dns = "cmd /c perl F:\\ubuntu\\export_dns_zones.pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        if (_am.getMFP().ib_export.getSelectedIndex() == 0) {
                            process = Runtime.getRuntime().exec(cmd_ipam);
                        }
                        if (_am.getMFP().ib_export.getSelectedIndex() == 1) {
                            process = Runtime.getRuntime().exec(cmd_backup);
                        }
                        if (_am.getMFP().ib_export.getSelectedIndex() == 2) {
                            process = Runtime.getRuntime().exec(cmd_module);
                        }
                        if (_am.getMFP().ib_export.getSelectedIndex() == 3) {
                            process = Runtime.getRuntime().exec(cmd_dns);
                        }

                        while (process.exitValue() != 0 || process.exitValue() != 1) {
                            progress++;
                            System.out.println(progress);
                        }
                        System.out.println("done");

                        //process.waitFor();
                        if (process.exitValue() == 0) {
                            System.out.println("Command Successful");
                            System.out.println(path);
                        } else {
                            System.out.println("Command Failure");
                        }
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(process.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (Exception ex) {
                    }
                    progress++;
                     }
                }
            });
            thread.start();
        }
    }

Danke sehr fuer Ihre Hilfe!!!
 
S

SlaterB

Gast
wie unnötig kompliziert, anscheinend könntest du das unleserliche
Java:
String cmd_ipam = "cmd /c perl F:\\ubuntu\\export_subnets_ip_csv.pl" + " " + "-s" + " " + masterip + " "
        + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
String cmd_backup = "cmd /c perl F:\\ubuntu\\export_database.pl" + " " + "-s" + " " + masterip + " "
        + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
String cmd_module = "cmd /c perl F:\\ubuntu\\export_perlmodule.pl" + " " + "-s" + " " + masterip + " "
        + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
String cmd_dns = "cmd /c perl F:\\ubuntu\\export_dns_zones.pl" + " " + "-s" + " " + masterip + " "
        + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
if (_am.getMFP().ib_export.getSelectedIndex() == 0) {
    process = Runtime.getRuntime().exec(cmd_ipam);
}
if (_am.getMFP().ib_export.getSelectedIndex() == 1) {
    process = Runtime.getRuntime().exec(cmd_backup);
}
if (_am.getMFP().ib_export.getSelectedIndex() == 2) {
    process = Runtime.getRuntime().exec(cmd_module);
}
if (_am.getMFP().ib_export.getSelectedIndex() == 3) {
    process = Runtime.getRuntime().exec(cmd_dns);
}
auch einfach durch
Java:
int index = _am.getMFP().ib_export.getSelectedIndex();
String file = null;
if (index == 0) {
    file = "subnets_ip_csv";
}
if (index == 1) {
    file = "database";
}
if (index == 2) {
    file = "perlmodule";
}
if (index == 3) {
    file = "dns_zones";
}
// evtl. Abbruch wenn file null geblieben ist
String cmd = "cmd /c perl F:\\ubuntu\\export_"+file+".pl" + " " + "-s" + " " + masterip + " "
        + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
ersetzen, was auch noch nicht die kürzeste Variante ist

--------

zu deinem Problem:
wieso vermutest du dass dein Monitor schuld ist, wird er Prozess ohne Monitor besser abgearbeitet?
wenn irgendwas gar das Betriebssystem stört, könnte man doch diesen separaten Prozess vermuten,
für Java eher nicht bekannt, obwohl es natürlich Endlosschleifen mit 100% CPU-Belastung gibt

edit:
ok, die Schleife in Zeile 14,
> while (!pm.isCanceled() && progress <= pm.getMaximum()) {
ist wohl so ein Fall, wann sollte die je beendet werden, zum Prozess kommt es gar nicht erst?

die Schleife gehört vielleicht in einen zweiten Thread neben dem Prozess und auch dann solltest du Thread.sleep(100); einbauen,
10x Update pro Sekunde reicht, muss nicht Millionen Mal sein
 
Zuletzt bearbeitet von einem Moderator:

zdrel

Mitglied
Vielen Dank für die Antwort, SlaterB!

Ich habe deine erste Anmerkung zur Kenntnis genommen und sofort den Code optimiert, danke!
Also, dieser Code funktioniert einwandfrei, Perl Skript wird ausgeführt und Ergebnis kommt wie es sein soll:
Java:
class ExportButtonListener implements ActionListener {

        private Process process;
        int progress = 0;

        public void actionPerformed(ActionEvent e) {
                    try {
                        String masterip = _am.getAP().ip.getText();
                        String login = _am.getAP().login.getText();
                        char[] passwort = _am.getAP().password.getPassword();
                        String passwordnew = new String(passwort);
                        String path = _am.getMFP().output.getText();
                        int index = _am.getMFP().ib_export.getSelectedIndex();
                        String file = "";

                        if (index == 0) {
                            file = "subnets_ip_csv";
                        }
                        if (index == 1) {
                            file = "database";
                        }
                        if (index == 2) {
                            file = "perlmodule";
                        }
                        if (index == 3) {
                            file = "dns_zones";
                        }
                        String cmd = "cmd /c perl F:\\ubuntu\\export_" + file + ".pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        process = Runtime.getRuntime().exec(cmd);
                        process.waitFor();
                        if (process.exitValue() == 0) {
                            System.out.println("Command Successful");
                        } else {
                            System.out.println("Command Failure");
                        }
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(process.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
        }
    }

Und während der Ausführung des Sktiptes wollte ich dem ProgressMonitor einbauen, damit er mir den Fortschritt anzeigt. Und das klappt nicht. Das sollte passieren waehrend mein Prozess wartet: process.waitFor(); Ich habe hier versucht mit schleifen zu spielen aber nichts geklappt:
Java:
class ExportButtonListener implements ActionListener {

        private Process process;
        int progress = 0;

        public void actionPerformed(ActionEvent e) {

            Thread thread = new Thread(new Runnable() {

                public void run() {
                    final ProgressMonitor pm = new ProgressMonitor(null, "Lade...", "", 0, 100);
                    pm.setMillisToDecideToPopup(0);
                    pm.setMillisToPopup(0);

                    try {
                        String masterip = _am.getAP().ip.getText();
                        String login = _am.getAP().login.getText();
                        char[] passwort = _am.getAP().password.getPassword();
                        String passwordnew = new String(passwort);
                        String path = _am.getMFP().output.getText();
                        int index = _am.getMFP().ib_export.getSelectedIndex();
                        String file = "";

                        if (index == 0) {
                            file = "subnets_ip_csv";
                        }
                        if (index == 1) {
                            file = "database";
                        }
                        if (index == 2) {
                            file = "perlmodule";
                        }
                        if (index == 3) {
                            file = "dns_zones";
                        }
                        String cmd = "cmd /c perl F:\\ubuntu\\export_" + file + ".pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        process = Runtime.getRuntime().exec(cmd);

                        while (process.exitValue() != 0 || process.exitValue() != 1) {

                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    pm.setProgress(progress);
                                    pm.setNote(progress + " ... " + " done");
                                }
                            });
                            progress++;
                            System.out.println(progress);
                        }
                        System.out.println("done");

                        process.waitFor();
                        if (process.exitValue() == 0) {
                            System.out.println("Command Successful");
                            System.out.println(path);
                        } else {
                            System.out.println("Command Failure");
                        }
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(process.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
            thread.start();
        }
    }

Könntest du mir vielleicht hier helfen, ich komme nicht zurecht mit diesen Schleifen( Und wo genau soll ich Thread.sleep(100) einbauen? Vielen Dank!
 
S

SlaterB

Gast
das Sleep kommt eben in die Schleife
> while (process.exitValue() != 0 || process.exitValue() != 1) {
hinein, z.B. gleich als ersten Befehl

so wie es im Moment aussieht könnte es theoretisch funktionieren, wairFor() wäre dann überflüssig,
die Schleife in Zeile 40 läuft ja genau bis zum Ende

wie sieht es ohne diese Schleife, dann aber mit waitFor(), aus? wie lange dauert das Skript, welcher Wert ist der exitValue()?
und wenn du die Schleife drin hast, was passiert dann? blockiert der exitValue()-Aufru?

ansonsten hoffe ich mit dem sleep(100), dann die Schleifendurchläufe mitzählen und Ausgaben einbauen, 10 Durchläufe sind 1 sec,
nach einer bestimmten Zahl von Durchläufen muss ja der Prozess fertig sein, läuft da die Schleife immer noch oder wird sie beendet?

also was ist jeweils der Stand, ich mag mir nicht aufwendig irgendeinen Prozess bauen um das zu testen, das kannst du alles selber herausfinden,
Monitor muss erstmal nicht sein, es reichen System.out.println()-Ausgaben,
wird in allen Fällen das Ende erkennt, gibt es Zwischenausgaben dass es noch läuft? usw.

was soll überhaupt
> pm.setProgress(progress);
bedeuten, das kompiliert doch nicht?
an den Monitor kannst du nur einen int-Wert übergeben,
wenn du nicht vorher weißt wie lange der Prozess dauert, dann kannst du natürlich auch keine sinnvolle Aussage zum Stand treffen,
ansonsten z.B. aus der bisher vergangen Zeit und erwarteten Gesamtzeit einen Wert von 0-100 berechnen

-----

generell hatte ich ja noch angedacht:
ein Thread startet Prozess + waitFor(), ein zweiter Thread mit der Schleife,
muss aber nicht sein, wenn es bisher so klappt
 

zdrel

Mitglied
Vielen Dank dir SlaterB, dass du mir hilfst!!!!!!!!!!!!

>das Sleep kommt eben in die Schleife
> while (process.exitValue() != 0 || process.exitValue() != 1) {
>hinein, z.B. gleich als ersten Befehl
Habe ich gemacht (s. Code unten)

>so wie es im Moment aussieht könnte es theoretisch funktionieren, wairFor() wäre dann überflüssig,
>die Schleife in Zeile 40 läuft ja genau bis zum Ende
ja, das ist klar, waitFor mache ich hier raus. Du hast Recht, theoretusch sollte es funktionieren, aber geht nicht. Der wartet immer bis witFor() durch ist, also bis Skript sein Ergebnis liefert dann beginnt der(


>wie sieht es ohne diese Schleife, dann aber mit waitFor(), aus? wie lange dauert das Skript, welcher >Wert ist der exitValue()?
Wenn ich diese Schleife auskomentiere, dann wird das Skript ganz normal ausgefuehrt, es erscheint natuerlich kein ProgressMonitor, ich bekomme Meldung "Command Successful" und ausgabe auf die Konsole des Skriptsoutputs(wie es sein soll). Das heisst process.waitFor() liefert mir process.exitValue=0! Also Prozess wird ergolgreich bearbeitet! Nun mit Progress MOnitor hat er kein Bock zu funktionieren(
>und wenn du die Schleife drin hast, was passiert dann? blockiert der exitValue()-Aufru?
Wenn die Schleife drin ist, dann wartet er trotzdem bis Skript seine Arbeit gemacht hat, DANN erscheint der ProgressMOnitor (nicht waehrend), zaehlt bis 100, geht weg und Schleife geht unendlich hoch, sogar wenn ich das Programm geschlossen habe. Stoppt nur dann, wenn ich Run -> Stop Build/Run druecke (Netbeans). Bis ausgabe "done" geht das Programm nicht.


>ansonsten hoffe ich mit dem sleep(100), dann die Schleifendurchläufe mitzählen und Ausgaben >einbauen, 10 Durchläufe sind 1 sec
funktioniert leider nicht
>nach einer bestimmten Zahl von Durchläufen muss ja der Prozess fertig sein, läuft da die Schleife >immer noch oder wird sie beendet?
Schleife geht unendlich weiter(


>also was ist jeweils der Stand, ich mag mir nicht aufwendig irgendeinen Prozess bauen um das zu >testen, das kannst du alles selber herausfinden,
>Monitor muss erstmal nicht sein, es reichen System.out.println()-Ausgaben,
>wird in allen Fällen das Ende erkennt, gibt es Zwischenausgaben dass es noch läuft? usw.
Wie gesagt ohne Monitor bekomme ich die Meldung "Command successful", also nach dem Skript ausfuehrung ist die prozess.exitValue=0, wie es sein soll.

was soll überhaupt
> pm.setProgress(progress);
keine Ahnung, habe mich nach deinem Beispielkode orientiert wenn du dem MonsterBit im Mai 2010 geholfen hast!
>bedeuten, das kompiliert doch nicht?
kommt keine Fehlermeldung
>an den Monitor kannst du nur einen int-Wert übergeben,
>wenn du nicht vorher weißt wie lange der Prozess dauert, dann kannst du natürlich auch keine >sinnvolle Aussage zum Stand treffen,
Ausfuehrung des Skriptes dauert 13 sec. Aber das kommt drauf an wie viele DAten er exportiert, also ich wollte dass ProgressMonitor das mir anzeigt...
>ansonsten z.B. aus der bisher vergangen Zeit und erwarteten Gesamtzeit einen Wert von 0-100 berechnen
wie geht das?

Java:
class ExportButtonListener implements ActionListener {

        private Process process;
        int progress = 0;

        public void actionPerformed(ActionEvent e) {


            Thread thread = new Thread(new Runnable() {

                public void run() {
                    final ProgressMonitor pm = new ProgressMonitor(null, "Lade...", "", 0, 100);
                    pm.setMillisToDecideToPopup(0);
                    pm.setMillisToPopup(0);
//                        SwingUtilities.invokeLater(new Runnable() {
//
//                            public void run() {
//                                pm.setProgress(progress);
//                                pm.setNote(progress + " ... " + " done");
//                            }
//                        });
                    try {
                        String masterip = _am.getAP().ip.getText();
                        String login = _am.getAP().login.getText();
                        char[] passwort = _am.getAP().password.getPassword();
                        String passwordnew = new String(passwort);
                        String path = _am.getMFP().output.getText();
                        int index = _am.getMFP().ib_export.getSelectedIndex();
                        String file = "";

                        if (index == 0) {
                            file = "subnets_ip_csv";
                        }
                        if (index == 1) {
                            file = "database";
                        }
                        if (index == 2) {
                            file = "perlmodule";
                        }
                        if (index == 3) {
                            file = "dns_zones";
                        }
                        String cmd = "cmd /c perl F:\\ubuntu\\export_" + file + ".pl" + " " + "-s" + " " + masterip + " "
                                + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                        process = Runtime.getRuntime().exec(cmd);

                        while (process.waitFor() != 0 || process.waitFor() != 1) {
                            Thread.sleep(100);
                            //process.waitFor();
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    pm.setProgress(progress);
                                    pm.setNote(progress + " ... " + " done");
                                }
                            });
                            progress++;
                            System.out.println(progress);
                        }
                        //process.waitFor();
                        System.out.println("done");

                        if (process.exitValue() == 0) {
                            System.out.println("Command Successful");
                        } else {
                            System.out.println("Command Failure");
                        }
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(process.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
            thread.start();
        }
    }
 
S

SlaterB

Gast
> Der wartet immer bis witFor() durch ist, also bis Skript sein Ergebnis liefert dann beginnt der(

nun achte doch mal drauf konkrete Dinge korrekt zu beantworten,
in dem Fall steht doch erstmal die Schleife an, was passiert ganz konkret?
- die Schleife könnte sauber laufen, anscheinend ja nicht
- der process.exitValue() könnte blockieren, wie ich schon direkt gefragt hatte, du hast nicht geantwortet
- der exitValue ist 0, obwohl der Prozess noch nicht beendet ist, dann wird die Schleife abgebrochen, es geht zum vielleicht doch noch vorhandenen waitFor(),
ist es das? dokumentiere das ganz exakt,
System.out.println("exitValue ist .., breche jetzt die Schleife ab ja/nein");
solche Programmverläufe kannst du millimetergenau verfolgen und jede einzelne Aktion vollständig klären,
in deinem Code zumindest

falls eine Schleife mit process.exitValue() nicht sinnvoll ist, kannst du wie schon zweimal gesagt mehrere Threads verwenden,
einer wartet mit waitFor() auf das Ende des Prozesses, der andere fragt nicht auch den Prozess (weil der entweder blockiert oder falschen exitValue liefert), sondert wartet auf den anderen Thread

und nochmal: erst muss eigentlich mit System.out.println geklärt werden, wie die Abläufe sind,
wenn alles zum Prozess funktioniert kann es noch tausend andere Dinge geben, warum der Monitor dann nicht geht,

hier allerdings ein gekürztes Beispiel doch auch mit Monitor, vielleicht kennst du aber schon ähnliches aus dem alten Thread,
ohne konkrete exakte Informationen zu obigen konkreten Fragen kann ich nicht weitehelfen,
habe nach wie vor keine Lust und kaum eine Möglichkeit, selber einen Prozess ablaufen zu lassen,
irgendwie ein Dummy-Java-Programm starten vielleicht..



Java:
public class TestGUI  extends JFrame {

    public TestGUI()   throws Exception  {
        JButton b = new JButton("klick");
        b.addActionListener(new ExportButtonListener());

        add(b);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 300);
        setVisible(true);
    }

    public static void main(String[] args)    throws Exception  {
        new TestGUI();
    }
}


class ExportButtonListener  implements ActionListener {

    int progress = 0;
    public void actionPerformed(ActionEvent e) {
        Thread thread = new Thread(new Runnable()  {
                public void run()    {
                    final ProgressMonitor pm = new ProgressMonitor(null, "Lade...", "", 0, 100);
                    pm.setMillisToDecideToPopup(0);
                    pm.setMillisToPopup(0);

                    try  {
                        Runnable r = new Runnable()  {
                                public void run()   {
                                    // dieser zweite Thread könnte bei dir den Prozess starten 
                                    // und bis zu dessen Ende warten 
                                    try   {
                                        Thread.sleep(2000);
                                    }    catch (Exception e)     {    }
                                }
                            };
                        Thread t2 = new Thread(r);
                        t2.start();

                        while (t2.isAlive()) {
                            Thread.sleep(100);
                            SwingUtilities.invokeLater(new Runnable()  {
                                    public void run()   {
                                        pm.setProgress(progress);
                                        pm.setNote(progress + " ... " + " done");
                                    }
                                });
                            progress++;
                            System.out.println(progress);
                        }
                        System.out.println("done");
                    }
                    catch (Exception ex)  {
                        ex.printStackTrace();
                    }
                }
            });
        thread.start();
    }
}

-----

> > pm.setProgress(progress);
> keine Ahnung, habe mich nach deinem Beispielkode orientiert

ok, Variablen verwechselt. progress ist int, process ist Prozess
 
Zuletzt bearbeitet von einem Moderator:

zdrel

Mitglied
Danke, SlaterB!!!!!!!!!!!! Es funktioniert!!!!!!!!!!!!! Mit zwei Threads sieht es viel besser aus:
Java:
class ExportButtonListener implements ActionListener {

        private Process process;
        int progress = 0;

        public void actionPerformed(ActionEvent e) {


            Thread thread = new Thread(new Runnable() {

                public void run() {
                    final ProgressMonitor pm = new ProgressMonitor(null, "Export Data...", "", 0, 100);
                    pm.setMillisToDecideToPopup(0);
                    pm.setMillisToPopup(0);
                    
                    try {
                        Runnable r = new Runnable() {

                            public void run() {
                                // dieser zweite Thread konnte bei dir den Prozess starten und bis zu dessen Ende warten 
                                try {
                                    String masterip = _am.getAP().ip.getText();
                                    String login = _am.getAP().login.getText();
                                    char[] passwort = _am.getAP().password.getPassword();
                                    String passwordnew = new String(passwort);
                                    String path = _am.getMFP().output.getText();
                                    int index = _am.getMFP().ib_export.getSelectedIndex();
                                    String file = "";

                                    if (index == 0) {
                                        file = "subnets_ip_csv";
                                    }
                                    if (index == 1) {
                                        file = "database";
                                    }
                                    if (index == 2) {
                                        file = "perlmodule";
                                    }
                                    if (index == 3) {
                                        file = "dns_zones";
                                    }
                                    String cmd = "cmd /c perl F:\\ubuntu\\export_" + file + ".pl" + " " + "-s" + " " + masterip + " "
                                            + "-u" + " " + login + " " + "-p" + " " + passwordnew + " " + "-o" + " " + path;
                                    process = Runtime.getRuntime().exec(cmd);

                                    process.waitFor();
                                    //System.out.println("done");

                                    if (process.exitValue() == 0) {
                                        System.out.println("Command Successful");
                                    } else {
                                        System.out.println("Command Failure");
                                    }
                                    BufferedReader in = new BufferedReader(
                                            new InputStreamReader(process.getInputStream()));
                                    String line = null;
                                    while ((line = in.readLine()) != null) {
                                        System.out.println(line);
                                    }
                                } catch (Exception ex) {
                                    ex.printStackTrace();
                                }
                            }
                        };
                        Thread t2 = new Thread(r);
                        t2.start();
                        while (t2.isAlive()) {
                            Thread.sleep(115);
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    pm.setProgress(progress);
                                    pm.setNote(progress + " % " + " done");
                                }
                            });
                            progress++;
                            System.out.println(progress);
                        }
                        System.out.println("done");
                    } catch (Exception e) {
                    }
                }
            });
            thread.start();
        }
    }

Erstmal zu deinen Anmerkungen:

>nun achte doch mal drauf konkrete Dinge korrekt zu beantworten,
>in dem Fall steht doch erstmal die Schleife an, was passiert ganz konkret?
>- die Schleife könnte sauber laufen, anscheinend ja nicht
Ja, die Schleife ist nicht sauber gelaufen.

>- der process.exitValue() könnte blockieren, wie ich schon direkt gefragt hatte, du hast nicht >geantwortet
keine Ahnung ob der process.exitValue blockieren koennte, aber die Schleife lief unendlich hoch...

>- der exitValue ist 0, obwohl der Prozess noch nicht beendet ist, dann wird die Schleife >abgebrochen, es geht zum vielleicht doch noch vorhandenen waitFor(),
>ist es das? dokumentiere das ganz exakt,
>System.out.println("exitValue ist .., breche jetzt die Schleife ab ja/nein");
>solche Programmverläufe kannst du millimetergenau verfolgen und jede einzelne Aktion vollständig >klären, in deinem Code zumindest

Also, Schleife hat sich nicht beendet, bis exit Value kommt die gar nicht.

>falls eine Schleife mit process.exitValue() nicht sinnvoll ist, kannst du wie schon zweimal gesagt >mehrere Threads verwenden,
>einer wartet mit waitFor() auf das Ende des Prozesses, der andere fragt nicht auch den Prozess >(weil der entweder blockiert oder falschen exitValue liefert), sondert wartet auf den anderen Thread

Wunderbare Idee, hat auch funktioniert.
Aber ich habe trozdem ein Verstaendnisproblem mit Threads. Die Zeile Thread.sleep(115); wartet bis mein Prozess fertig ist, richtig? Und in der Zeit wird ja ProgressMonitor gepainted. 100 ms passen fast, aber wenn ich den anderen Skript ausfuehre, der macht schnellere Aufgabe, dann bleibt ProgressMonitor bei 35 stehen. Wie mache ich das Monitor genau bestimmt die Zeit in der der Skript seine Aufgabe macht?
 
S

SlaterB

Gast
> Also, Schleife hat sich nicht beendet, bis exit Value kommt die gar nicht.
wie soll die Schleife immer weiter laufen, ohne bei exitValue vorbeizukommen, das kann doch nicht übersprungen werden, na egal

> Wie mache ich das Monitor genau bestimmt die Zeit in der der Skript seine Aufgabe macht?
wie gesagt, das ist unmöglich,
genauso kannst du einen Mensch hinstellen und ihm sagen er soll von 0-10 zählen mit richtigen Pausen so dass bei Prozessende genau die 10 erscheint,
ein Mensch kann nicht zaubern, der Computer noch weniger,

entweder die generelle Laufzeit jedes Prozesses muss vorher ungefähr bekannt sein,
oder der Prozess selber muss irgendwie eine Rückmeldung geben, was gewiss schwierig ist
oder es geht ganz einfach nicht, dann kannst du nur 'läuft noch' vs. 'fertig' ausgeben, evtl. die vergangene Zeit anzeigen
 

zdrel

Mitglied
Ok, alles klar!

Vielen dank dir fuer deine Hilfe!!! Das Problem wurde geloest!!! Jetzt sieht mein GUI mehr oder weniger vernuenftig aus!!! Danke!
 

Ähnliche Java Themen

Neue Themen


Oben