CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: megthebest con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: megthebest con ben 9 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 35 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 10 su 10
Discussione:

Priorita hai Thread

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Priorita hai Thread

    Che voi sappiate c'è un modo o sapete come fare a dare una priorità ad un Thread?
    Io ho un thread che ha bisogno di una priorità alta, perchè ha il compito di suonare un effetto ogni tot tempo (fino ad un minimo di un decimo di secondo) solo che, sfruttando il Thread.sleep(), non è sempre preciso, e in piu se si usa contemporaneamente qualcos'altro, tipo cambiare la pagina della Home, mi crea un lag.
    Il codice nel punto cruciale è questo (Lo posto in caso sto cappellando qualcosa):
    codice:
    private void ciclaDurata(Durata temp){
    			long durataIntermedia, tempoNow;
    			pauseTotal = 0;
    			durataIntermedia = durataTotale;
    			timeStart = tempoNow = SystemClock.elapsedRealtime();
    			timeTemp = ((Durata)temp).getDurata();
    			while( tempoNow -(timeStart+pauseTotal) <= timeTemp){
    				if (currentStatus == PAUSE){
    				} else if (currentStatus == STOP){
    					break;
    				} else if (currentStatus == RUNNING) {
    					try {
    						Thread.sleep(70);
    					} catch (InterruptedException e) {
    
    						e.printStackTrace();
    					}
    					tempoNow = SystemClock.elapsedRealtime();
    					durataTotale = durataIntermedia + tempoNow -timeStart-pauseTotal;
    					updateListenerTick();
    
    				}
    
    			}
    			if (currentStatus != STOP){
    				durataTotale = durataIntermedia + timeTemp;
    				updateListenerTick();
    				if (onCall){
    					int how;
    					try{
    						how = Integer.parseInt(howToPlayOnCalling);
    					} catch (NumberFormatException ex){
    						how = 0;
    					}
    					switch(how){
    					case 0:
    						suoni.playSound(((Durata)temp).getIdBell());
    						break;
    					case 1:
    						suoni.playLowSound(((Durata)temp).getIdBell());
    					case 2:
    						break;
    					}
    				} else {
    					suoni.playSound(((Durata)temp).getIdBell());
    
    				}
    			}
    		}
    L'applicazione è questa:

  2.  
  3. #2
    Androidiano


    Registrato dal
    Oct 2010
    Messaggi
    63

    Ringraziamenti
    0
    Ringraziato 1 volta in 1 Post
    Predefinito

    Ogni tanto dai priorità a qualche buon libro di italiano, vedrai che si scrive "priorità ai thread" senza H.

  4. #3
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ops... No ma... Veramente è stato voluto per attirare attenzione.
    A parte quello, non è che sai darmi una mano?
    Momentaneamente ho ridotto lo sleep a 25, perchè con 70 posso avere degli scarti di 40 millesimi e si sentono. Pero mi serve proprio più priorità a quel thread.

  5. #4
    Baby Droid


    Registrato dal
    Jun 2010
    Messaggi
    35

    Ringraziamenti
    3
    Ringraziato 1 volta in 1 Post
    Predefinito

    Ciao per aumentare o diminuire la priorità di un thread usa il metodo setPriority()
    Nella classe Thread puoi trovare le costanti MAX_PRIORITY, MIN_PRIORITY E NORM_PRIORITY che possono essere usate con quel metodo.
    Dove è inizializzato questo thread? In un servizio?In un'activity?verifica perchè si possono modificare anche le le priorità di questi elementi.
    Infine puoi priorizzare l'intero processo (l'applicazione), segui questa guida:
    anddev.org &bull; View topic - [TinyTut] - Change Thread Priority
    Prova eventualmente ad utilizzare un Handler e usare sendDelayedMessage per richiamare una funzione ogni tot tempo.
    Ricorda che l'handler viene gestito usando il thread che lo ha creato, quindi se hai inizializzato un Handler in un Activity girerà solamente nel thread main, quindi è dipendente da tutte le azioni che vengono fatte nell'interfaccia grafica. Puoi comunque inizializzarlo che lavori in un altro thread e utilizzando il suo Looper. Se ti servono altre informazioni basta chiedere

  6. #5
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ciao Markov e grazie per la risposta.
    Il thread lo creo all'interno di un service:
    questo è il metodo (del service) che viene chiamato quando viene premuto il play
    codice:
    /**
    	 * Start the thread
    	 */
    	public void go(){
    		stop();
    		try {
    			thread.join(1000);
    		} catch (InterruptedException e) {
    		}
    		thread = new TimingThread();
    		thread.start();
    		
    	}
    Gli handler gli avevo gia provati (creati all'interno del service), la guida di anddev l'avevo letta, pero riprovero ancora, magari ho sbagliato qualcosa.

    Puoi spiegarmi meglio (anche con link)
    si possono modificare anche le le priorità di questi elementi
    questo?

  7. #6
    Androidiano


    Registrato dal
    Sep 2010
    Messaggi
    274

    Ringraziamenti
    10
    Ringraziato 9 volte in 8 Posts
    Predefinito

    Quote Originariamente inviato da Deadly Visualizza il messaggio
    Ops... No ma... Veramente è stato voluto per attirare attenzione.
    Scusa ma te lo dovevo dire:sei un grande.. dopo anni e anni di forum e di errori simili a questi sei il PRIMO che ci scherza su anziché tirare su storie pazzesche... tipo una volta uno ha scritto "l'hanno scorso" e quando qualcuno ha replicato ha detto che ha sbagliato a causa della sua tastiera con un layout diverso dal solito... hai tutta la mia simpatia!! :-)
    Scusate l'ot...


    Sent from my GT-I9000 using Tapatalk

  8. #7
    Baby Droid


    Registrato dal
    Jun 2010
    Messaggi
    35

    Ringraziamenti
    3
    Ringraziato 1 volta in 1 Post
    Predefinito

    Quote Originariamente inviato da Deadly Visualizza il messaggio
    Gli handler gli avevo gia provati (creati all'interno del service), la guida di anddev l'avevo letta, pero riprovero ancora, magari ho sbagliato qualcosa.
    Anche se un handler viene creato all'interno di un service, viene comunque eseguito sul thread main, quello che gestisce l'intera applicazione, dall'invio degli Intent alla gestione degli eventi dell'interfaccia utente, grafica etc.
    Come ti dicevo se in un Service vuoi usare un Handler con un thread suo apposito usa un codice come il seguente:
    codice:
    HandlerThread thread = new HandlerThread("Nome_Handler_thread",Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();
    Looper handlerLooper = thread.getLooper();
    MioHandler mHandler = new MioHandler(handlerLooper);
    Estendi infine la classe handler per gestire almeno il metodo handleMessage(Message msg)
    codice:
    class MioHandler extends Handler {
      public MioHandler(Looper looper) {
         super(looper);
      }
      @Override
      public void handleMessage(Message msg) {
        //TODO
      }
    In questo modo assicuri all'handler di essere gestito in un thread separato dal main e gli permetti di lavorare senza avere "risentimenti" da parte della grafica o del resto dell'applicazione.

    Per quanto riguarda la priorità dei Service dai un occhiata qui:
    Application Fundamentals | Android Developers
    Puoi vedere come possono essere gestite le priorità dei servizi e dei thread associati.

    Comunque io ti consiglio di usare l'handler, è più semplice, hai un codice pulito e non devi preoccuparti praticamente di nulla. Come vedi dal codice che ti ho scritto li puoi addirittura impostare la priorità con cui viene gestito il processo che gestisce il thread, guardati le api della classe Process per vedere quali sono le possibili priorità
    Process | Android Developers

    ciaooOo

  9. #8
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    @smartgatto
    Ehm... Ti ringrazio per il commento e per il sostegno morale...
    Sembra che vada di moda fare i grandoni, i seri, o mandare a quel paese gli altri... Ma io non seguo le mode e appena posso ci rido su.

    @markov
    Grazie anche a te, la storia del looper non la sapevo...
    Ottimo...

  10. #9
    Baby Droid


    Registrato dal
    Apr 2009
    Messaggi
    2

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Non so cosa devi fare esattamente, ma forse potresti usare la classe JETPlayer, è fatta appositamente per gli effetti audio realtime.

    Ciao

  11. #10
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ciao FireEater, grazie per il suggerimento, ma non penso mi serva il JetPlayer.
    Sintetizzando molto, la funzione del programma è suonare un effetto sonoro ogni tot di tempo scelto dall'utente.
    Per adesso sto cambiando l'implementazione usando l'HandlerThread etc.
    Sto cercando ancora il modo per gestire la pausa.
    Comunque quando avrò sistemato tutto studierò anche il JetPlayer per vedere se invece risulta piu utile del SoundPool.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy