Autore Topic: Problema Multithread  (Letto 1135 volte)

Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Problema Multithread
« il: 03 Gennaio 2012, 23:21:54 CET »
0
Ciao,
sto cercando di sviluppare un giochino, ma non riesco a capire come funziona il multithread.

Mi spiego meglio, cercando su internet ho capito come funzionano i thread e come si usano. Prendendo spunto da progetti già fatti ho scritto il codice che teoricamente dovrebbe funzionare. Purtroppo in pratica non funziona per niente, infatti al posto di eseguire "calcoli contemporaneamente" sembra eseguire un thread alla volta per poi mostrare solo i risultati dei calcoli dell'ultimo thread lanciato.

Mi spiego meglio illustrandovi il codice:
Codice (Java): [Seleziona]
public class ProvaActivity extends Activity {
    /** Called when the activity is first created. */
        Thread thread;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        //Vorrei avviare due thread distinti
        ThreadInizialize();
        ThreadInizialize();
       
    }
   
    int k=0; int i=0;
    private void ThreadInizialize() {
        thread = new Thread() {
           
           @Override
                public void run() {
                        //Codice eseguito da thread.start()
                        //Looper.prepare();
                       
                       
                          try {
                      // a Thread loop
                                k=k+1;
                      while(i<20) {
                          sleep(50);
                          // do things
                          threadHandler.sendEmptyMessage(1);
                          i++;

                      }
                  } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                               
                        } finally {
                                threadHandler.sendEmptyMessage(2);
                               
                      // this block always executes so take care here of
                      // unfinished business
                  }
           }
        };
           thread.start();
    }
   
        private Handler threadHandler = new Handler() {
                public void handleMessage(android.os.Message msg) {
                        // whenever the Thread notifies this handler we have
                        // only this behavior                  
                        if (msg.what == 1) {
                                Log.d(null, "k vale "+k);
                               
                        } else if (msg.what == 2) {
                               
                                //Riavvio
                                //ThreadInizialize();

                        }
                }
        };

}

Teoricamente nel LogCat (secondo le mie aspettative) dovrei vedere sia "k vale 1" sia "k vale 2".

Questo perchè io lancio i due thread nell'onCreate uno appresso all'altro, quindi entrambi iniziano a lavorare su k. Ma per il 1° thread k è inizializzato a 0 quindi k=k+1 da come risultato 1, mentre per il secondo thread a k è già stato assegnato 1 quindi k=k+1 vale 2.

Però nel logCat vedo solo una lunga serie di "k vale 2" come mai? Cosa ho sbagliato?

Grazie mille

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema Multithread
« Risposta #1 il: 04 Gennaio 2012, 01:18:09 CET »
0
Ti faccio notare che quello che fai tu è:

1)Inizializzo la variabile thread e ne faccio lo start
2)Sovrascrivo la precedente variabile thread e ne faccio lo start.

Non so se questo sia il comportamento desiderato o meno e sinceramente non so se potrebbe portare a un comportamento indefinito.

Detto ciò, se vuoi realizzare un semplice contatore ti conviene adottare una delle tecniche di sincronizzazione tra thread (ad esempio tramite wait() e notify() oppure andando a fare l'incremento di k dentro un metodo syncronized) perchè altrimenti incorri nel problema noto in letteratura come thread interference.
« Ultima modifica: 04 Gennaio 2012, 01:21:03 CET da Ricky` »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Multithread
« Risposta #2 il: 04 Gennaio 2012, 09:16:09 CET »
0
Ciao,
sto cercando di sviluppare un giochino, ma non riesco a capire come funziona il multithread.

Per cominciare a sviluppare un gioco, ti consiglio queste due letture, la prima spiega un semplice game loop, la seconda si concentra di più sulla grafica.

1) Android Game Development - A Basic Game Loop - Java Code Geeks
2) Playing with graphics in Android – Part I on Android Development
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Re:Problema Multithread
« Risposta #3 il: 04 Gennaio 2012, 11:10:30 CET »
0
@bradipao: Grazie per la guida, ma l'avevo già vista, anzi devo ammettere che sto prendendo spunto proprio da quella. Solo che per uno alle prime armi è un pò "confusionaria" quindi piano piano la digerirò. So che essendo agli inizi non dovrei cimentarmi in imprese troppo esagerato, però a mio parere fare cose difficili aiuta ad imparare meglio :)

@Ricky: Grazie mille per la dritta, ma ora il codice funziona a "metà" mi spiego meglio con degli esempi:

Se io scrivo:

Codice (Java): [Seleziona]
     int k=0;
    private void ThreadInizialize() {
       
        thread = new Thread() {
           
           @Override
           public void run() {
                   
                   synchronized(this) {
                           int i=0;
                           k=k+1;
                           
                   
                          while(i<20) {
                                   try {
                                           // a Thread loop
                                           

                                          /** wait(50); */
                                         
                                         
                                           Log.d(null, "k vale "+k);
                                   
                                                                        i++;
                                   
                                                        /**     } catch (InterruptedException e) { */
                                // TODO Auto-generated catch block
                               
                                                                        } finally {
                           //     threadHandler.sendEmptyMessage(0);
                               
                                                                        } //Fine try
                                        } //Fine While
                          //notifyAll();
                   } //Fine Synchronized
                   
                 
                 
                   } //Fine run
           }; //fine new Thread() {
           thread.start();
    }

Se io eseguo il metodo ThreadInizialize() così modificato (richiamandolo due volte dall'onCreate) quello che vedo stampato sul LogCat è "k vale 1" varie volte e poi "k vale 2". QUindi sembrerebbe funzionare. Ma ci sono due problemi.

Il 1° è che "k vale 1" e "k vale 2" dovrebbero venire visualizzati 20 volte ciascuna invece vengono visualizzati un numero "arbitrario" di volte. Ad esempio se avvio il programma magari mi stampa 8 volte "k vale 1" e 32 volte "k vale 2" e la volta dopo 7 volte "k vale 1" e 33 volte "k vale 2" (adesso che ho provato mi sono usciti questi valori, non so se sono collegati, ma prima comunque mi parevano del tutto casuali)

Quindi come mai non mi stampa:
k vale 1
k vale 1
... (per 20 volte)
k vale 2
k vale 2
... (per 20 volte)

Il 2° problema è che non capisco come usare wait e notify(). Se io ri-trasformo i commenti in blu in codice (quindi se nel ciclo c'è wait) il risultato sono solo tanti "k vale 2" (anche questi scritti un certo numero n di volte, che può anche essere maggiore di 20)

Mi potete aiutare?
Non pensavo questi thread fossero così difficili da gestire  :-(

Una curiosità, che differenza c'è tra sleep e wait? Comunque anche se al posto della wait metto sleep non cambia niente.
E tra l'altro non capisco come usare notify() perchè non mi sembra serva a molto  :-\

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Multithread
« Risposta #4 il: 04 Gennaio 2012, 11:22:40 CET »
0
@bradipao: Grazie per la guida, ma l'avevo già vista, anzi devo ammettere che sto prendendo spunto proprio da quella. Solo che per uno alle prime armi è un pò "confusionaria" quindi piano piano la digerirò. So che essendo agli inizi non dovrei cimentarmi in imprese troppo esagerato, però a mio parere fare cose difficili aiuta ad imparare meglio :)

Il problema è che quello che stai cercando di fare è abbastanza complicato e il modo in cui lo hai impostato è concettualmente errato. L'errore di fondo del tuo approccio è che lanci due thread che accedono alla stessa variabile k: si tratta quindi di accesso concorrente alla stessa risorsa (la variabile k) senza nessun meccanismo di sincronizzazione dell'accesso.

Per risolvere rapidamente il tuo problema, ti potrebbe bastare mettere int k=0 dentro il run() del thread, ma è abbastanza evidente che ti conviene procedere sulla via dei tutorial (ce ne sono anche per i thread nella sezione tutorial del forum).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema Multithread
« Risposta #5 il: 04 Gennaio 2012, 11:23:27 CET »
0
Comunque forse ieri sera, vista l'ora tarda, ti ho consigliato erroneamente.
Pensandoci bene, e facendo un piccolo esempio, credo che il tuo errore sia dovuto al fatto che usi erroneamente l'oggetto thread, andando a sovrascriverlo.
Questo è un semplice codice java che mi sono scritto:

Codice (Java): [Seleziona]
public class Prova {

        static int k = 0;

        public static void main(String[] args) {
                new Thread(new MyRunnable()).start();
                new Thread(new MyRunnable()).start();
        }

        static class MyRunnable implements Runnable {

                @Override
                public void run() {
                        k++;
                        for (int i = 0; i < 20; i++) {
                                System.out.println("k vale: " + k + " i vale: " + i);
                        }
                }

        }

}

e questo è il suo output:

Codice: [Seleziona]
k vale: 1 i vale: 0
k vale: 1 i vale: 1
k vale: 1 i vale: 2
k vale: 1 i vale: 3
k vale: 1 i vale: 4
k vale: 1 i vale: 5
k vale: 1 i vale: 6
k vale: 1 i vale: 7
k vale: 1 i vale: 8
k vale: 1 i vale: 9
k vale: 1 i vale: 10
k vale: 1 i vale: 11
k vale: 1 i vale: 12
k vale: 1 i vale: 13
k vale: 1 i vale: 14
k vale: 1 i vale: 15
k vale: 1 i vale: 16
k vale: 1 i vale: 17
k vale: 1 i vale: 18
k vale: 1 i vale: 19
k vale: 2 i vale: 0
k vale: 2 i vale: 1
k vale: 2 i vale: 2
k vale: 2 i vale: 3
k vale: 2 i vale: 4
k vale: 2 i vale: 5
k vale: 2 i vale: 6
k vale: 2 i vale: 7
k vale: 2 i vale: 8
k vale: 2 i vale: 9
k vale: 2 i vale: 10
k vale: 2 i vale: 11
k vale: 2 i vale: 12
k vale: 2 i vale: 13
k vale: 2 i vale: 14
k vale: 2 i vale: 15
k vale: 2 i vale: 16
k vale: 2 i vale: 17
k vale: 2 i vale: 18
k vale: 2 i vale: 19


Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Re:Problema Multithread
« Risposta #6 il: 04 Gennaio 2012, 11:30:08 CET »
0
in effetti il "mio metodo" è poco pratico, anzi direi errato.. però non trovo alternative.

Il programma della guida che mi hai linkato te deve solamente gestire un singolo sprites che cammina sullo schermo, quindi gli basta un Thread.

Nel mio giochino invece ci sono (per come l'ho pensato) molti sprites che camminano sullo schermo quindi volevo gestirli singolarmente utilizzando un thread per ciascuno di essi.

Voi che proponete? Perchè sinceramente non ho idea di come gestire tutti questi sprites con un solo thread.. teoricamente per gestirli con un solo thread dovrei fare qualcosa del tipo:
Codice (Java): [Seleziona]
class Sprite {
...

public void SetPos(int x, int y) {
...
}
...
}

//nell'onCreate dovrei mettere:
Sprite sprite1 = new Sprite();
Sprite sprite2 = new Sprite();
Sprite sprite3 = new Sprite();

//Al thread dovrei far eseguire qualcosa del tipo
sprite1.SetPos(x,y);
sprite2.SetPos(x,y);
sprite3.SetPos(x,y);

In questo modo, generando per ciascuno x e y allora li posso muovere tutti insieme, però io li vorrei creare in maniera dinamica, usando una sola variabile. Quindi volevo fare che aprendo un thread si crea un oggetto, e aprendo un'altro thread se ne creava un'altro in "parallelo"..

consigli?

EDIT: Ricky mi sto studiando il tuo codice, ti farò sapere.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema Multithread
« Risposta #7 il: 04 Gennaio 2012, 11:36:50 CET »
0
Il codice che ti ho postato va bene se  tieni k fino a 2.
Nel caso in cui volessi, ad esempio, fare un contatore con k fino a 100 inizierebbero le grane.

Immagina di cambiare il metodo run in questo modo (ho aggiunto anche in nome del thread per vedere chi esegue cosa):

Codice (Java): [Seleziona]
                @Override
                public void run() {

                        while (k < 100) {
                                        k++;
                                        for (int i = 0; i < 20; i++) {
                                                System.out
                                                                .format("Thread: %s k: %d i:%d\n", name, k, i);

                                        }
                        }
                }

L'output sarebbe una roba del genere:

Codice: [Seleziona]
Thread: primo k: 1 i:0
Thread: primo k: 2 i:1
Thread: primo k: 2 i:2
Thread: primo k: 2 i:3
Thread: primo k: 2 i:4
Thread: primo k: 2 i:5
Thread: primo k: 2 i:6
Thread: primo k: 2 i:7
Thread: primo k: 2 i:8
Thread: primo k: 2 i:9
Thread: primo k: 2 i:10
Thread: primo k: 2 i:11
Thread: primo k: 2 i:12
Thread: primo k: 2 i:13
Thread: primo k: 2 i:14
Thread: primo k: 2 i:15
Thread: primo k: 2 i:16
Thread: primo k: 2 i:17
Thread: primo k: 2 i:18
Thread: primo k: 2 i:19
Thread: primo k: 3 i:0
Thread: primo k: 3 i:1
Thread: primo k: 3 i:2
Thread: primo k: 3 i:3
Thread: primo k: 3 i:4
Thread: primo k: 3 i:5
Thread: primo k: 3 i:6
Thread: primo k: 3 i:7
Thread: primo k: 3 i:8
Thread: primo k: 3 i:9
Thread: primo k: 3 i:10
Thread: primo k: 3 i:11
Thread: primo k: 3 i:12
Thread: primo k: 3 i:13
Thread: primo k: 3 i:14
Thread: primo k: 3 i:15
Thread: primo k: 3 i:16
Thread: primo k: 3 i:17
Thread: primo k: 3 i:18
Thread: primo k: 3 i:19
Thread: primo k: 4 i:0
Thread: primo k: 4 i:1
Thread: primo k: 4 i:2
Thread: primo k: 4 i:3
Thread: primo k: 4 i:4
Thread: primo k: 4 i:5
Thread: primo k: 4 i:6
Thread: primo k: 4 i:7
Thread: primo k: 4 i:8
Thread: primo k: 4 i:9
Thread: primo k: 4 i:10
Thread: primo k: 4 i:11
Thread: primo k: 4 i:12
Thread: primo k: 4 i:13
Thread: primo k: 4 i:14
Thread: primo k: 4 i:15
Thread: primo k: 4 i:16
Thread: primo k: 4 i:17
Thread: primo k: 4 i:18
Thread: primo k: 4 i:19
Thread: primo k: 5 i:0
Thread: primo k: 5 i:1
Thread: primo k: 5 i:2
Thread: primo k: 5 i:3
Thread: primo k: 5 i:4
Thread: primo k: 5 i:5
Thread: primo k: 5 i:6
Thread: primo k: 5 i:7
Thread: primo k: 5 i:8
Thread: primo k: 5 i:9
Thread: primo k: 5 i:10
Thread: primo k: 5 i:11
Thread: primo k: 5 i:12
Thread: primo k: 5 i:13
Thread: primo k: 5 i:14
Thread: primo k: 5 i:15
Thread: primo k: 5 i:16
Thread: primo k: 5 i:17
Thread: primo k: 5 i:18
Thread: primo k: 5 i:19
Thread: primo k: 6 i:0
Thread: primo k: 6 i:1
Thread: primo k: 6 i:2
Thread: primo k: 6 i:3
Thread: primo k: 6 i:4
Thread: primo k: 6 i:5
Thread: primo k: 6 i:6
Thread: primo k: 6 i:7
Thread: primo k: 6 i:8
Thread: primo k: 6 i:9
Thread: primo k: 6 i:10
Thread: primo k: 6 i:11
Thread: primo k: 6 i:12
Thread: primo k: 6 i:13
Thread: primo k: 6 i:14
Thread: primo k: 6 i:15
Thread: primo k: 6 i:16
Thread: primo k: 6 i:17
Thread: primo k: 6 i:18
Thread: primo k: 6 i:19
Thread: primo k: 7 i:0
Thread: primo k: 7 i:1
Thread: primo k: 7 i:2
Thread: primo k: 7 i:3
Thread: primo k: 7 i:4
Thread: primo k: 7 i:5
Thread: primo k: 7 i:6
Thread: primo k: 7 i:7
Thread: primo k: 7 i:8
Thread: primo k: 7 i:9
Thread: primo k: 7 i:10
Thread: secondo k: 2 i:0
Thread: secondo k: 7 i:1
Thread: secondo k: 7 i:2
Thread: secondo k: 7 i:3
Thread: secondo k: 7 i:4
Thread: secondo k: 7 i:5
Thread: secondo k: 7 i:6
Thread: secondo k: 7 i:7
Thread: secondo k: 7 i:8
Thread: secondo k: 7 i:9
Thread: secondo k: 7 i:10
Thread: secondo k: 7 i:11
Thread: secondo k: 7 i:12
Thread: secondo k: 7 i:13
Thread: secondo k: 7 i:14
Thread: secondo k: 7 i:15
Thread: secondo k: 7 i:16
Thread: secondo k: 7 i:17
Thread: secondo k: 7 i:18
Thread: secondo k: 7 i:19
Thread: secondo k: 8 i:0
Thread: secondo k: 8 i:1
Thread: secondo k: 8 i:2
Thread: secondo k: 8 i:3
Thread: secondo k: 8 i:4
Thread: secondo k: 8 i:5
Thread: secondo k: 8 i:6
Thread: secondo k: 8 i:7
Thread: secondo k: 8 i:8
Thread: secondo k: 8 i:9
Thread: secondo k: 8 i:10
Thread: secondo k: 8 i:11
Thread: secondo k: 8 i:12
Thread: secondo k: 8 i:13
Thread: secondo k: 8 i:14
Thread: secondo k: 8 i:15
Thread: secondo k: 8 i:16
Thread: secondo k: 8 i:17
Thread: secondo k: 8 i:18
Thread: secondo k: 8 i:19
Thread: secondo k: 9 i:0
Thread: secondo k: 9 i:1
Thread: secondo k: 9 i:2
Thread: secondo k: 9 i:3
Thread: secondo k: 9 i:4
Thread: secondo k: 9 i:5
Thread: secondo k: 9 i:6
Thread: secondo k: 9 i:7
Thread: secondo k: 9 i:8
Thread: secondo k: 9 i:9
Thread: secondo k: 9 i:10
Thread: secondo k: 9 i:11
Thread: secondo k: 9 i:12
Thread: secondo k: 9 i:13
Thread: secondo k: 9 i:14
Thread: secondo k: 9 i:15
Thread: secondo k: 9 i:16
Thread: secondo k: 9 i:17
Thread: secondo k: 9 i:18
Thread: secondo k: 9 i:19
Thread: secondo k: 10 i:0
Thread: secondo k: 10 i:1
Thread: secondo k: 10 i:2
Thread: secondo k: 10 i:3
Thread: secondo k: 10 i:4
Thread: secondo k: 10 i:5
Thread: secondo k: 10 i:6
Thread: secondo k: 10 i:7
Thread: secondo k: 10 i:8
Thread: secondo k: 10 i:9
Thread: secondo k: 10 i:10
Thread: secondo k: 10 i:11
Thread: secondo k: 10 i:12
Thread: secondo k: 10 i:13
Thread: secondo k: 10 i:14
Thread: secondo k: 10 i:15
Thread: secondo k: 10 i:16
Thread: secondo k: 10 i:17
Thread: secondo k: 10 i:18
Thread: secondo k: 10 i:19
Thread: secondo k: 11 i:0
Thread: secondo k: 11 i:1
Thread: secondo k: 11 i:2
Thread: secondo k: 11 i:3
Thread: secondo k: 11 i:4
Thread: secondo k: 11 i:5
Thread: secondo k: 11 i:6
Thread: secondo k: 11 i:7
Thread: secondo k: 11 i:8
Thread: secondo k: 11 i:9
Thread: secondo k: 11 i:10
Thread: secondo k: 11 i:11
.....

Come vedi, non funziona più come dovrebbe.

Per rimediare basta che ti dichiari un oggetto nella classe principale e sincronizzi il blocco su quell'oggetto. Non va bene sincronizzare su "this" perchè essendo instanze diverse chiaramente anche l'intrinsic lock va a finire su due oggetti diversi. In questo modo dovrebbe funzionare correttamente.

Codice (Java): [Seleziona]
public class Prova {

        static int k = 0;
        static Object obj = new Object();

        public static void main(String[] args) {
                new Thread(new MyRunnable("primo")).start();
                new Thread(new MyRunnable("secondo")).start();
        }

        static class MyRunnable implements Runnable {

                String name;

                public MyRunnable(String name) {
                        this.name = name;
                }

                @Override
                public void run() {

                        while (k < 100) {
                                synchronized (obj) {
                                        k++;
                                        for (int i = 0; i < 20; i++) {
                                                System.out
                                                                .format("Thread: %s k: %d i:%d\n", name, k, i);

                                        }
                                }
                        }
                }
        }

}


Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Re:Problema Multithread
« Risposta #8 il: 04 Gennaio 2012, 11:48:28 CET »
0
Se utilizzo il metodo main ottengo un messaggio di errore:

Codice (Text): [Seleziona]
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (classFileParser.cpp:3494), pid=2752, tid=1716
#  Error: ShouldNotReachHere()
#
# JRE version: 6.0_29-b11
# Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode windows-x86 )
# An error report file with more information is saved as:
# C:\Documents and Settings\NOME_UTENTE\Documenti\AndroidProjects\Prova\hs_err_pid2752.log
#
# If you would like to submit a bug report, please visit:
#   [url=http://java.sun.com/webapps/bugreport/crash.jsp]HotSpot Virtual Machine Error Reporting Page[/url]
#

Se scrivo il tuo codice ma metto i due "new Thread(..." nell'onCreate succede come prima, mi viene scritto "k vale N" un certo numero di volte che non corrisponde a 20..

Comunque grazie mille per l'aiuto che mi state dando, ora provo direttamente a fare un nuovo proggetto e mi studio l'ultimo codice da te postato

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Multithread
« Risposta #9 il: 04 Gennaio 2012, 11:48:43 CET »
0
in effetti il "mio metodo" è poco pratico, anzi direi errato.. però non trovo alternative.

Il programma della guida che mi hai linkato te deve solamente gestire un singolo sprites che cammina sullo schermo, quindi gli basta un Thread.

Nel mio giochino invece ci sono (per come l'ho pensato) molti sprites che camminano sullo schermo quindi volevo gestirli singolarmente utilizzando un thread per ciascuno di essi.

L'approccio di un thread per sprite è sconsigliatissimo.

Se rileggi il link sui game-loop, vedi che l'approccio corretto è avere un unico thread, che si occupa di 1) prelevare input utente, 2) aggiornare stato e posizione di tutti gli sprite, 3) ridisegnare il frame, per poi ripartire da 1).

Qua è tutto spiegato, se anche appare complesso, non è comunque detto che non sia la soluzione più semplice al problema.

Android Game Development - A Basic Game Loop - Java Code Geeks
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Re:Problema Multithread
« Risposta #10 il: 04 Gennaio 2012, 12:12:02 CET »
0
@Ricky: ok, grazie mille il tuo codice funziona, adesso finalmente ho un esempio su cui basarmi per la gestioni dei thread  :-)

@bradipao: Proverò a rivedere la guida, però per come ho implementato il codice adesso la vedo dura gestire tutto da un singolo thread, ma ci proverò

EDIT:
bradipao: ho rivisto la guida ma non mi aiuta. Infatti nella guida nel metodo run del thread inserisce un ciclo dove incrementa una variabile. Nel mio codice all'interno del ciclo while contenuto nel metodo run io sposto il mio sprites (riprendendo l'esempio di prima dico: sprite1.SetPos(x,y); ). Fino a quando si tratta di uno tutto bene, basta che creo il nuovo sprite con:
sprite = new Sprite();
poi lancio il thread ed è fatta. Però come fare quando ne voglio visualizzare due? o lancio due thread distinti oppure nel ciclo controllo entrambi gli sprite, per controllare entrambi gli sprite devo creare per forza due variabili sprite1 e sprite2 (o al massimo un array) e questo però mi limita molto. Infatti così ho un numero fissato di sprite, se lancio il thread per forza questo mi visualizza i due sprite e non 1 e non 3 a meno che non intervengo da codice, ma in run-time non posso fare nulla. Al massimo potrei implementare un metodo del tipo sprite.visible(boolean); e "giocare" con quello.. però non è quello che mi aspettavo, perchè ho comunque a che fare con oggetti statici, ossia sono quelli e basta, non ne posso creare di nuovi in run-time e questo mi scoccia.. qualche idea?
« Ultima modifica: 04 Gennaio 2012, 12:22:38 CET da GregWildfire »