Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : exec friert Prozess ein



eule
28-01-2007, 13:55
Guten Tag

Ich schreibe gerade ein Programm das ein GUI für für Streamripper wird.
In einem Teil muss ich dafür Streamripper starten, was auch prima funktioniert. Doch nach ca einer halben Stunde friert der Prozess einfach ein. Die Datei (die aufgenommen wird) wird nicht mehr größer. Der Prozess ist aber noch da und abbrechbar.
Hat wer eine Ahnung wie ich nachschauen kann, was mit dem Prozess passiert? Legt die jre die irgendwie nach einiger Zeit schlafen? Ich kann mir das absolut nicht vorstellen.

Zur Testzwecken habe ich mal nebenbei Streamripper von der Konsole gestartet. Der lief dann ohne Probleme und hat auch keine Anzeichen gebracht, warum der von Java gestartete Prozess einfrieren sollte.

Ich wäre für jeden Tipp dankbar, was ich jetzt machen könnte.

P.s.: Ich habe java6 auf Linux, Exclipse als Übersetzer.

edit:
Unter Windows sieht man das besonders schnell, wie ich gerade festgestellt habe. Dieser Code übersetzt und ausgeführt verweigert nach 2,2MB die Aufnahme, während den Befehl über die Windows Commandline bis zum bitteren Ende aufnimmt. Kann das wer bestätigen? Das ist echt zu weinen.


import javax.swing.*;
import java.awt.event.*;
import java.io.*;

public class start
{
private JFrame frame = new JFrame("Test");
private JButton startButton = new JButton("Start");
private JButton stopButton = new JButton("Stopp");

Process p = null;

public start()
{
JPanel panel = new JPanel();
frame.add(panel);
panel.add(startButton);
panel.add(stopButton);

frame.setSize(200,65);
frame.setVisible(true);

startButton.addActionListener(new StartListener());
stopButton.addActionListener(new Stopplistener());
}

class StartListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try
{
p = Runtime.getRuntime().exec("streamripper.exe http://listen.to.techno4ever.net");
}

catch (IOException f)
{
JOptionPane.showMessageDialog(frame,"Fehler beim" +
"Ausführen von Strearipper:\n"+f);
System.err.println("Fehler beim Ausführen von Streamripper"+f);
}

}
}

class Stopplistener implements ActionListener
{
public void actionPerformed(ActionEvent g)
{
p.destroy();
}
}

public static void main(String[] args)
{
new start();
}
}


Streamripper gibts übrigends hier: http://sourceforge.net/project/showfiles.php?group_id=6172&package_id=135477

anda_skoa
29-01-2007, 01:10
Möglicherweise läuft der Ausgabepuffer voll, weil du nicht aus den beiden InputStream von Process liest.

Ciao,
_

peschmae
29-01-2007, 05:48
Zumindest unter Windows ist mir das schon passiert, dass wie von anda_skoa erwähnt der Ausgabepuffer volllief und das externe Programm deswegen stehen blieb.

Unter Linux hatte ich das noch nie - da scheint der Puffer grösser zu sein. ;)

MfG Peschmä

eule
29-01-2007, 10:19
Jo. Das kann ich bestätigen. Unter Linux ist er bei mit 24 mal größer als unter Windows. Trotzdem ist er irgendwann voll. Wenn ich die Ausgaben abstelle läuft er ewig lang. Das wäre schon mal gelöst.

Das Problem beim Auslesen des Streams ist nur, dass es nicht funktioniert. Wenn ich den InputStream mit read() oder readline() lese, bleibt er hängen bis ich den Prozess abbreche. Dann bekomme ich natürlich eine -1 bzw null zurück.

Kann es sein, dass der InputStream in sich schon gebuffert wird und auf ein eof wartet? Weil Streamripper gibt ja kein eof bis man es beendet.

peschmae
29-01-2007, 12:44
Also bei mir hat das ganze wie hier beschrieben jeweils funktioniert: http://peschmae.kilu.de/documentation/swt/online/chunk/ch03s02.html#d0e759

Also mit:



BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
}


Wobei ich in dem konkreten Falle nur den Stdout auslese; auf stderr kam da nichts afair.
Wenn beide Streams gelesen werden wollen hab ich das dann halt jeweils mit Threads gelöst (oder eventuell auch mit einem Thread der zuerst mit InputStream.available() checkt ob es überhaupt was aus dem Stream zu lesen gibt)

MfG Peschmä

anda_skoa
29-01-2007, 17:03
readline kann noch blockieren, wenn der Prozess keine Newlines macht.

Wenn man den Output nicht braucht, besser einfach Datenblöcke lesen und verwerfen.
Man kann ja mit available() nachsehen, wieviel da ist

Ciao,
_

peschmae
29-01-2007, 18:50
Da hast du recht. Mein Prozess machte newlines :)

MfG Peschmä

eule
31-01-2007, 13:42
Müsste ich dann aber nicht wenigstens mit read() ein Zeichen holen können? Auch wenn kein newline kommt?
Das klappt auch nicht.

peschmae
31-01-2007, 16:57
Was sagt denn available()?

Eventuell schreibt das ja alles auf einen von stdout/err und du liest den falschen...

MfG Peschmä

eule
31-01-2007, 18:37
Danke. Mit available bin ich dann dahinter gekommen, dass der die Ausgabe auf Error sendet. Jetzt läuft es wie es soll.

nochmals danke an euch.