Hintergrundprozesse

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich schreibe gerade ein eigenes kleines CD-Ripping-Tool.

Meine Klasse Cd hat u.a die Methoden

Code:
public boolean ripTrack(int track)
public boolean encodeTrack(int track, int format)

Bisher war es so, dass ich erst immer den Audiotrack gerippt habe und anschließend das Encoding gemacht habe. Hier will ich Zeit einsparen, in dem ich sobald der Track gerippt ist, mit dem nächsten Track beginnen kann und das Encoding im Hintergrund abläuft.

Wie würdet ihr das realisieren?

Ich hatte zunächst meiner Methode ripTrack noch den Parameter format zugeführt und die encodeTrack-Methode private gemacht. Ich kann natürlich auch eine neue Methode ripAndEncodeTrack() schreiben - egal:

jedenfalls habe ich dann

Code:
public boolean ripTrack(int track, int format) {
	//ripping
	//Aufruf der encodeTrack im Hintergrund
}

Geht das überhaupt? Beendet er dann überhaupt die Methode ripTrack bevor er mit dem encodeTrack fertig ist. Ich weiß das Zauberwort heißt Threads, doch wie realisiere ich das an dieser Stelle?
 

Mag1c

Top Contributor
Hi,

hast du sowas wie eine Track-Klasse ? Oder geht das ripping direkt in eine Datei ?
Im Prinzip sind Ripping und Encoding verschiedene Sachen, die auch einzeln ihre Anwendung finden könnten. Ich würde also auch die Funktionalität getrennt halten und dem Workflow (CD rippen und encoden) überlassen, was wann in welcher Reihenfolge und in welchem Thread ausgeführt werden soll. Überhaupt hat das Encoding mit der Cd-Klasse eigentlich nichts mehr zu tun.

grob könnte das dann so aussehen (pseudocode):

Code:
for (i=1; i < tracks; i++) {
    Track tr = cd.ripTrack(i);
    new EncodingThread(tr).start();
}

Gruß
Mag1c
 
G

Gast

Gast
Ok, das encoding hatte ich damals da mit reingeschrieben, da sich ne neue Klasse noch nicht lohnte - jetzt werde ich es wohl auftrennen, danke fuer den Tipp.
 
G

Gast

Gast
Wie es scheint, laeuft es nun trotzdem nicht richtig im Hintergrund. Er beendet den Schleifendurchlauf erst, wenn der Thread fertig ist. Woran koennte das liegen:
Code:
String[] tracks = cd.getMetaData().getTracks();
			for (int i = 0; i < tracks.length; i++) {
				boolean exit = cd.ripTrack(i+1);
				if (exit) {
					new EncodingThread(i+1,Cd.FLAC,cd.getMetaData(),folder).start();
				}
			}
 
G

Gast

Gast
Besser formuliert: Vermutlich macht er alles korrekt, nur wie kann ich es erreichen, dass er sobald er mit dem Rippen des einen Tracks fertig ist, mit dem naechsten beginnt und das encoding wirklich im Hintergrund macht.
 

Mag1c

Top Contributor
Hi,

wie hast du denn den Thread definiert ? Das müsste in etwa so aussehen:

Code:
public class EncodingThread extends Thread {
    public EncodingThread (...) {
        ...
    }

    public void run () {
        // hier encoden
    }
}

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben