Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

funzione con timer

Discussioni e opinioni costruttive sul mondo dell'informatica.
Per la soluzione di problemi specifici fare riferimento alle sezioni di assistenza!

Moderatori: aurelio37, axelrox

funzione con timer

Postdi barbicha » 10/07/04 12:11

ciao, avrei bisogno di un programma che registrasse un segnale audio da un microfono per due secondi.
ho trovato già del codice per registrare ( vedi codice alla fine della pagina http://www.developer.com/java/other/article.php/1579071) ma non ho idea di come si possa impostare il timer che blocchi la registrazione due secondi dopo il click sul pulsante cattura.
sapete aiutarmi?? grazie!!!! :D
ciao!
barbicha
Utente Junior
 
Post: 16
Iscritto il: 04/07/04 14:02

Sponsor
 

Postdi dado » 10/07/04 12:53

Non puoi bloccarlo tu con un tasto stop (premetto che non ho presente come sia fatto il programma, ma mi baso sull'esperienza con Total Recorder...).

House: "Vede, tutti pensano che sia un paziente a causa del bastone"
Wilson: "Allora perchè non indossa un camice bianco come tutti noi?"
House: "Perchè altrimenti pensano che sia un medico".
Avatar utente
dado
Utente Senior
 
Post: 16208
Iscritto il: 21/08/01 01:00
Località: La Città dei Sette Assedi

Postdi barbicha » 10/07/04 13:01

no, ho bisogno che sia necessariamente una registrazione di 2 secondi..
barbicha
Utente Junior
 
Post: 16
Iscritto il: 04/07/04 14:02

Postdi netghost » 10/07/04 14:22

puoi editare il suono ottenuto, e tagliarlo proprio alla lunchezza di due secondi :D
se hai installato nero, hai già un registratore-editor di file (wave editor) che puoi usare per questa operazione.
ASUS A7V600 // AMD athlon XP 2800 // DDR 512 PC400 // HD maxtor SATA 120 giga // GE-FORCE FX 5200 // monitor 109E5 PHILIPS // DVD ASUS // CD-RW Waitec // DVD RW Nec ND2510A
netghost
Utente Senior
 
Post: 139
Iscritto il: 19/02/04 00:15
Località: SARDEGNA

Postdi Xanathar » 10/07/04 19:03

Puoi creare un secondo thread concorrente al primo che invoca un tuo metodo :)

Ti passo la soluzione che usa una classe mia :

La tua classe dovrebbe implementare

Codice: Seleziona tutto
public interface Tickable
{
/** Procedura richiamata ad intervalli approssimativamente regolari */
   public void timeTick();
}


Con la classe seguente puoi gestire il secondo thread :

Codice: Seleziona tutto

public class TimeController implements Runnable
{
   /** specifica il ritardo tra una chiamata e l'altra in millisecondi */
   public int m_nDelay;
   /** il Tickable che verrà gestito da questo TimeController */
   private Tickable m_Tick;
   /** il Thread che gestisce questo TimeController */
   private Thread m_thread;
   /** variabile che indica se il TimeController deve continuare a eseguire.
   Poiché un thread esegue solo letture e l'altro solo scritture, non è necessaria sincronizzazione. */
   private boolean m_keepAlive = false;
   /** variabile che indica il numero di istanza del TimeController */
   private static int m_nHynstNumber = 0;
   
   /**
   * Costruisce un nuovo TimeController
   * @param p_Tick il Tickable su cui richiamare il metodo timeTick
   * @param delay il delay tra un frame e l'altro in millisecondi
   */
   public TimeController (Tickable p_Tick, int delay)
   {
      m_Tick = p_Tick;
      m_nDelay = delay;
   }
   
   /**
   * Costruisce un nuovo TimeController con un delay fisso di 30ms
   * @param p_Tick il Tickable su cui richiamare il metodo timeTick
   */
   public TimeController (Tickable p_Tick)
   {
      m_Tick = p_Tick;
      m_nDelay = 30;
   }

   /**
   * Avvia il TimeController
   da questo momento il metodo timeTick dell'oggetto Tickable associato potrebbe essere richiamato
   */
   public void start()
   {
      if (m_keepAlive) return;
      m_keepAlive = true;
      m_thread = new Thread(this, "TimeCtrl" + m_nHynstNumber);
      m_nHynstNumber++;
      m_thread.start();
   }
   
   /**
   * Procedura principale del TimeController : non dovrebbe essere richiamata da programma..
   */
   public void run()
   {
   
      while (m_keepAlive) {
      
         m_Tick.timeTick();
         System.out.print(".");
         try { Thread.sleep(m_nDelay);  }
            catch(InterruptedException e) { System.out.println("Thread interrotto!");}
      }

   }

   /**
   * Termina (con attesa) il thread del TimeController
   */
   public void stop()
   {
      if (!m_keepAlive) return;
      m_keepAlive = false;
      try {
         m_thread.join();
         } catch(InterruptedException e) { System.out.println("Thread interrotto!");}
   }
   
   /**
   * Restituisce true se il TimeController sta girando, false altrimenti.
   @returns True se il TimeController è attivo, false altrimenti.
   */
   public boolean isAlive ()
   {
      return m_keepAlive;
   }
}



Semplicemente fai :

Codice: Seleziona tutto
// variabili :
private TimeController m_timeCtrl;
private int m_elapsedTime;

// nel costruttore :
m_timeCtrl = new TimeController(this); // un timetick ogni 30ms

// metodo :
public void timeTick()
{   
   m_elapsedTime += 30;
         if (m_elapsedTime >= 2000)
         {
                stopWaveRecording();
                m_timeCtrl.stop();
         }
}

// infine dove inizi la registrazione fai :
m_timeCtrl.start();



Potresti anche costruire direttamente l'oggetto con Delay = 2000, ma con un intervallo di 30ms dovresti essere più al sicuro da effetti tipo "venire chiamato una volta di troppo all'inizio" o "un tick piu tardi" ... A meno che per te faccia davvero differenza se è 1970ms o 2030ms in tal caso forse Java non è il linguaggio adatto :)

Tutto questo naturalmente se mi ricordo bene.. sono classi che avevo fatto per l'esame di Java di qualche anno fa all'uni :P Era un gioco tipo DynaBlaster e puoi trovare gioco e sorgenti in http://digilander.libero.it/xanathar/jbomb.zip . Magari ti sono d'aiuto per altro :) [ho ripreso Java da pochi giorni per provare a fare un gioco per cellulari quindi non mi ricordo granchè.. più che probabile che ho scritto boiate!]
---------------------------------------------------------------
..George dice che ogni buon americano dovrebbe avere un'aspirapolvere in cantina..
Xanathar
Reporter
 
Post: 124
Iscritto il: 21/11/03 06:12
Località: Torino :)

Postdi Xanathar » 10/07/04 19:05

Ho dimenticato un ovvio ma indispensabile :

Codice: Seleziona tutto
private int m_elapsedTime = 0;


e chissà quanti altri errori.. cmq dovrebbe essere una base :) good luck ;)
---------------------------------------------------------------
..George dice che ogni buon americano dovrebbe avere un'aspirapolvere in cantina..
Xanathar
Reporter
 
Post: 124
Iscritto il: 21/11/03 06:12
Località: Torino :)


Torna a Discussioni


Topic correlati a "funzione con timer":


Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti