ZoRaC Skrevet 26. april 2007 Del Skrevet 26. april 2007 Har plutselig oppdaget at spillet ikke avslutter trådene for å spille av lyd når lyden er ferdig. Har ikke jobbet så mye med tråder, så er glad om noen kan komme med noen tips til hvordan jeg skal få lukket trådene når de er ferdig... Lyd.java: /* * Lyd.java * * Created on 28. mars 2007, 11:04 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package Spill; import java.io.File; import java.io.IOException; import java.net.*; import java.applet.*; import javax.sound.sampled.*; /** * * @author Marthe */ public class Lyd extends Applet implements Runnable { String[] allLyd = { "nyttSpill", "forsvinn", "ugyldig", "nylevel", "combo", "gameover", "sekk", "bokhylle", "highscore"}; public static final int NYTT_SPILL = 0; public static final int FORSVINN = 1; public static final int UGYLDIG = 2; public static final int NY_LEVEL = 3; public static final int COMBO = 4; public static final int GAME_OVER = 5; public static final int SEKK = 6; public static final int BOKHYLLE = 7; public static final int HIGHSCORE = 8; private Clip lyden; private int lydNr; Innstillinger innst = Innstillinger.getInstance(); public Lyd(int lydNr) { AudioInputStream audioInputStream = null; Clip m_clip = null; URL clipFile = null; try { clipFile = SpillApplet.class.getResource(innst.LYD_MAPPE + allLyd[lydNr] + ".wav"); } catch (Exception ex) { ex.printStackTrace(); } try { audioInputStream = AudioSystem.getAudioInputStream(clipFile); } catch (Exception e) { e.printStackTrace(); } if (audioInputStream != null) { AudioFormat format = audioInputStream.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, format); try { m_clip = (Clip) AudioSystem.getLine(info); m_clip.open(audioInputStream); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("ClipPlayer.(): kan ikke lese filen " + clipFile.toString()); } lyden = m_clip; } public void run() { lyden.loop(0); System.out.println("ferdig med loop"); lyden.stop(); // for sikkerhetsskyld;) stop(); } public void stop() { System.out.println("stop-metode"); if (lyden != null) { lyden.stop(); lyden = null; } } } Spiller av lyd med: Thread t = new Thread(new Lyd(Lyd.FORSVINN)); t.setPriority(Thread.MAX_PRIORITY); t.start(); Lenke til kommentar
hockey500 Skrevet 26. april 2007 Del Skrevet 26. april 2007 java har vel Thread.Join()? Gjør ikke den metoden det du spør etter? Lenke til kommentar
krigun Skrevet 26. april 2007 Del Skrevet 26. april 2007 Tråden dør når run() metoden kjører ferdig. I dette tilfellet henger den kanskje på et eller annet metodekall, ikke vet jeg. Ha en sysout i slutten av run() metoden for å være sikker på at den blir ferdig. Lenke til kommentar
ZoRaC Skrevet 26. april 2007 Forfatter Del Skrevet 26. april 2007 Kjøre den etter t.start() da eller? Vil den ikke da vente til tråden er ferdig? Da vil jo ikke tråden ha noen hensikt...? Men, etter nærmere feilsøking så ser det kanskje ut til at det er noe av det som skjer i konstruktøren til Lyd som oppretter en tråd som aldri slutter... noen ideer om det? Lenke til kommentar
krigun Skrevet 26. april 2007 Del Skrevet 26. april 2007 java har vel Thread.Join()? Gjør ikke den metoden det du spør etter? 8476043[/snapback] Thread.join() lar current thread vente på at en annen tråd blir ferdig, er jo ikke det han ønsker her tror jeg.. Lenke til kommentar
hockey500 Skrevet 26. april 2007 Del Skrevet 26. april 2007 (endret) hmm, nei hadde vært litt kjedelig om spillet stoppet hver gang en lyd skulle spilles av ja. men går det ikke an å ha en tråd som kjører hele tiden, istedenfor å lage og avslutte en hver gang du trenger å spille av en lyd? kjør en metode i 2. tråd som lytter etter en sound-event i 1. tråd, og heller sende hvilken lyd som et parameter? jeg har aldri programmert i java, men det skulle vel være mulig? jeg vet ikke hvilke begrensninger som finnes siden dette skal gjøres på kryss av tråder, men det ville vel vært en mer elegant løsning enn din opprinnelige ide hvertfall. Endret 26. april 2007 av hockey500 Lenke til kommentar
krigun Skrevet 26. april 2007 Del Skrevet 26. april 2007 jeg vet ikke hvilke begrensninger som finnes siden dette skal gjøres på kryss av tråder, men det ville vel vært en mer elegant løsning enn din opprinnelige ide hvertfall. 8476089[/snapback] Jepp, noe sånt som dette: public class Sound extends Thread { public Sound() {} public void playSound(String soundFile) { //TODO: load file, etc.. synchronized(this) { notify(); } } public void run() { while(true) { //Ikke så smart kanskje.. synchronized(this) { wait(); } //Spill av her.. } } } (koden er nok ikke helt perfekt..) Lenke til kommentar
ZoRaC Skrevet 26. april 2007 Forfatter Del Skrevet 26. april 2007 Ser ut til å ha funnet løsningen! Var ikke nok å kjøre lyden.stop(), måtte kjøre .close() i tillegg.. Koden ble tilslutt slik: ... public void run() { lyden.loop(0); // Sjekker lengden på lyd-klippet int lengde = lyden.getFrameLength(); // Looper til den er ferdig while (lyden.getFramePosition() < lengde) { try { Thread.sleep(500); } catch (InterruptedException ex) { ex.printStackTrace(); } } // Stopper når den er ferdig stop(); } public void stop() { System.out.println("stop-metode"); if (lyden != null) { lyden.stop(); lyden.close(); lyden = null; } if (audioInputStream != null) { try { audioInputStream.close(); } catch (IOException ex) { ex.printStackTrace(); } audioInputStream = null; } if (info != null) { info = null; } if (format != null) { format = null; } } Takk for alle tips! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå