IllegalThreadStateException im CapturePlugin?!?

Hier haben Plugin-Entwickler die Möglichkeit, sich auszutauschen.
Antworten
mmo
Junior Member
Beiträge: 24
Registriert: 19 Okt 2005, 01:48

IllegalThreadStateException im CapturePlugin?!?

Beitrag von mmo »

Hallo,

ich versuche aus dem TVBrowser heraus direkt meinen Archos-500 ("portable video recorder") zu programmieren. Ich habe mir dazu das Capture Plugin angesehen und es sollte eigentlich alle dazu nötigen Funktionen bieten (und natürlich noch weit mehr, was ich aber für diese einfache Aufgabe gar nicht brauche...).

Also habe ich ein kleines Java-Programm geschrieben, dass alle Infos als Commandline-Parameter entgegennimmt, sie für den Archos-500 aufbereitet und diesem dann übergibt. Im Capture-Plugin habe ich ein entsprechendes "Device" konfiguriert und dort unter Application die entsprechende Commandline und unter Parameters->Record die zu übergebenden Parameter definiert.

Wenn ich nun auf eine Sendung rechts-klicke und dann "Archos=>Record" anklicke kommen auch alle Daten brav an und die ganze Choose würde eigentlich auch bestens funktionieren, wenn nicht NACH der Übergabe (also dann wenn eigentlich schon alles gelaufen ist) das Capture-Plugin immer abstürzen würde:

Ich bekomme nach Ablauf des Timeouts immer die folgende Fehlermeldung:
Error while excecuting.

----- Start of stacktrace -----
java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(Native Method)
at captureplugin.drivers.defaultdriver.CaptureExecute.executeApplication(CaptureExecute.java:269)
at captureplugin.drivers.defaultdriver.CaptureExecute.execute(CaptureExecute.java:150)
at captureplugin.drivers.defaultdriver.CaptureExecute.addProgram(CaptureExecute.java:105)
at captureplugin.drivers.defaultdriver.DefaultDevice.add(DefaultDevice.java:205)
at captureplugin.CapturePlugin$2.actionPerformed(CapturePlugin.java:242)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1000)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1041)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
----- End of stacktrace -----
Ich habe mit verschiedenen Timeout values gespielt, aber auch wenn ich die auf 15 Sekunden und mehr hochschraube (mein Progrämmchen braucht allerhöchstens 1-2 Sekunden) bekomme ich die obige Fehlermeldung. Warum wartet das Plugin eigentlich überhaupt auf den gestarteten Prozess? Ich habe doch das "check if returns error value" abgewählt. Irgendwas scheine ich hier nicht begriffen zu haben!

Wie starte ich aus dem Capture-Plugin ein Programm und fertig. Ich erwarte NICHT, dass das Plugin anschliessend von dem gestarteten Programm noch irgendwas wissen oder etwas damit zu tun haben will. Kann mir das evtl. jemand erklären? Oder ist das ein Bug im Plugin? Oder warum bekomme ich diese ThreadStateExceptions???

Michael
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Kann es sein, das dein Java-Programm sich nicht korrekt beendet?
mmo
Junior Member
Beiträge: 24
Registriert: 19 Okt 2005, 01:48

Beitrag von mmo »

Also, wenn ich es von Hand aufrufe, dann beendet es sich! Und ich verwende auch keine Threads oder wait()-s oder sonstwas, was das Beenden des Programms verhindern könnten. Alle Pfade enden in einem System.exit(<0 oder 1>);

Ich hatte dann auch testweise das einzige "while" in ein "if" abgeändert (meine Original-Version hätte erlaubt, mehr als nur eine einzige Sendung auf's Mal zu programmieren...). Nun gab es keinen Loop mehr, die unbeabsichtigt hängen könnte. Schliesslich bin ich hingegangen und habe nach probeweise gleich am Programmanfang ein System.exit(0); eingefügt und das dann langsam immer weiter nach hinten verschoben.

Dabei ist mir dann aufgefallen, dass das Problem irgendwie mit der Menge des Outputs auf System.out zu tun zu haben scheint, den das Program erzeugt! Mein Programm hatte noch einige debug-Messages ausgegeben und hatte ursprünglich vielleicht alles in allem etwa 100 Zeilen ausgegeben.

Nun habe ich diese abgeklemmt (bzw. habe ein "verbose" flag eingebaut, das die meisten Meldungen abklemmt), so dass es jetzt nur noch ca. 5 Zeilen produziert und damit funktioniert das Teil nun ohne sonstige Änderungen wie erwartet! Meine Vermutung daher: bei mehr Output läuft hier irgend ein Puffer voll und - weil auf der anderen Seite zu dem Zeitpunkt vermutlich niemand liest - blockiert das Programm sich dann beim Schreiben nach System.out und daher schlägt dann irgendwann der Timeout zu!

Tja, die Pipe-buffers - immer wieder eine Quelle der Überraschung... :-(

Gruss,
Michael
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Hm...muß ich mir mal bei gelegenheit anschauen.
ds10
Site Admin
Beiträge: 19117
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Beitrag von ds10 »

Das Problem kenn' ich, das hat mir auch oft Probleme gemacht. Folgende Problemlösung gibt es:

Code: Alles auswählen

class StreamReaderThread extends Thread {
	InputStream is;

	StreamReaderThread(InputStream is) {
		this.is = is;
	}

	public void run() {
		try {
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);
			while (br.readLine() != null)
				;

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
Beim Starten des externen Prozesses wird dies dann folgendermaßen verwendet:

Code: Alles auswählen

Process p = Runtime...

StreamReaderThread errors = new StreamReaderThread(p.getErrorStream());
errors.start();

// read out the Input-Stream of the process (it's the input for
// this but it's the output of the proccess)
StreamReaderThread out = new StreamReaderThread(pr.getInputStream());
out.start();
Das Ganze muss man dann nur für die jeweilige Anwendung anpassen.
mmo
Junior Member
Beiträge: 24
Registriert: 19 Okt 2005, 01:48

Beitrag von mmo »

Also - das Progrämmchen funktioniert nun!

Programmieren einer gewünschten Sendung in den AV500 mit einem Klick (na gut: ZWEI Klicks, aber nur weil das Capture Plugin noch einmal nachfragt!) ;-)

Ist evtl. jemand daran interessiert? Dann laßt's mich wissen und ich mache das Programm verfügbar!

Gruss,
Michael (michael dot moser at freesurf dot ch)
Antworten