Gå til innhold

Tråder som opprettes og aldri avsluttes


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 av hockey500
Lenke til kommentar
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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...