-
[java] dubbio threadScritto dagengivaUtente privileggiatoil 2012-05-02 08:14:54.0 alle 2012-05-02 08:14:54.0Trollate totali: 9100ho un problema con delle animazioni
immaginate uno spazio tridimensionale e un ipotetico personaggio che spara un proiettile identificato da un vettore
il programma ha una funzione draw(), che funziona da loop per le animazioni in cui inserire tutto quello che dev'essere visualizzato e che fa da sola "l'update"
se in questa funzione inserisco per esempio:
if(MouseIsCliccato){spara();}
e in spara() metto
for(float i=0; i<100; i++){
vettore=(x+i,y+i,z+i);
disegnaProiettile(vettore);
}
funziona
però mettiamo caso che questo proiettile debba muoversi lentamente, diminuireste l'incremento di i?
no, perché il personaggio non potrebbe muoversi finché il ciclo for non è terminato.
allora per ogni proiettile bisognerebbe creare un thread? si? no?
perché se faccio:
class proiettile extends Thread{
[...]
void run(){
for(float i=0; i<100; i++){
vettore=(x+i,y+i,z+i);
disegnaPunto(vettore);
sleep(200);
}
}
}
il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
quindi il problema è che se in un programma ci sono più vettori che devono muoversi ecc, voi che siete degli informatici cervelloni e anche un po culattoni, come gestireste la faccenda
Cercatelo con Google, ritardato! ©-
Re: [java] dubbio threadScritto da: gengiva
> ho un problema con delle animazioni
> immaginate uno spazio tridimensionale e un ipotetico personaggio che spara un proiettile identificato da un vettore
>
> il programma ha una funzione draw(), che funziona da loop per le animazioni in cui inserire tutto quello che dev'essere visualizzato e che fa da sola "l'update"
>
> se in questa funzione inserisco per esempio:
>
> if(MouseIsCliccato){spara();}
>
> e in spara() metto
>
> for(float i=0; i<100; i++){
> vettore=(x+i,y+i,z+i);
> disegnaProiettile(vettore);
> }
>
> funziona
> però mettiamo caso che questo proiettile debba muoversi lentamente, diminuireste l'incremento di i?
> no, perché il personaggio non potrebbe muoversi finché il ciclo for non è terminato.
>
> allora per ogni proiettile bisognerebbe creare un thread? si? no?
> perché se faccio:
>
> class proiettile extends Thread{
>
> [...]
>
> void run(){
> for(float i=0; i<100; i++){
> vettore=(x+i,y+i,z+i);
> disegnaPunto(vettore);
> sleep(200);
> }
> }
> }
>
> il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
> quindi il problema è che se in un programma ci sono più vettori che devono muoversi ecc, voi che siete degli informatici cervelloni e anche un po culattoni, come gestireste la faccenda
>
>
A me sembra un problema di sincronizzazione degli accessi ad una variabile.Young professional woman and busy mom.-
Re: [java] dubbio threadScritto dagengivaUtente privileggiatoil 2012-05-02 08:32:27.0 alle 2012-05-02 08:32:27.0Trollate totali: 9100Scritto da: ::1
> Scritto da: gengiva
> > ho un problema con delle animazioni
> > immaginate uno spazio tridimensionale e un ipotetico personaggio che spara un proiettile identificato da un vettore
> >
> > il programma ha una funzione draw(), che funziona da loop per le animazioni in cui inserire tutto quello che dev'essere visualizzato e che fa da sola "l'update"
> >
> > se in questa funzione inserisco per esempio:
> >
> > if(MouseIsCliccato){spara();}
> >
> > e in spara() metto
> >
> > for(float i=0; i<100; i++){
> > vettore=(x+i,y+i,z+i);
> > disegnaProiettile(vettore);
> > }
> >
> > funziona
> > però mettiamo caso che questo proiettile debba muoversi lentamente, diminuireste l'incremento di i?
> > no, perché il personaggio non potrebbe muoversi finché il ciclo for non è terminato.
> >
> > allora per ogni proiettile bisognerebbe creare un thread? si? no?
> > perché se faccio:
> >
> > class proiettile extends Thread{
> >
> > [...]
> >
> > void run(){
> > for(float i=0; i<100; i++){
> > vettore=(x+i,y+i,z+i);
> > disegnaPunto(vettore);
> > sleep(200);
> > }
> > }
> > }
> >
> > il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
> > quindi il problema è che se in un programma ci sono più vettori che devono muoversi ecc, voi che siete degli informatici cervelloni e anche un po culattoni, come gestireste la faccenda
> >
> >
>
> A me sembra un problema di sincronizzazione degli accessi ad una variabile.
il problema è che non saprei nemmeno quale sia la risorsa condivisa, perché il metodo si crea le sue cosine da solo e accede in sola lettura alle coordinate, mentre l'eccezione si propaga su per i metodi delle librerie che uso
dovrei dichiarare il metodo Synchronized
Cercatelo con Google, ritardato! ©-
Re: [java] dubbio threadScritto da: gengiva
> dovrei dichiarare il metodo Synchronized
Difficile da dire, ma in genere evita se puoi.
Inoltre, IMHO, la suora ha ragione e il problema risiede altrove`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: [java] dubbio threadScritto dagengivaUtente privileggiatoil 2012-05-02 08:41:47.0 alle 2012-05-02 08:41:47.0Trollate totali: 9100Scritto da: Giambo
> Scritto da: gengiva
>
> > dovrei dichiarare il metodo Synchronized
>
> Difficile da dire, ma in genere evita se puoi.
> Inoltre, IMHO, la suora ha ragione e il problema risiede altrove
già, infatti non funge
ma ascolta, quando avvio un thread, questo muore da solo quando ha finito di fare le sue cose nè?
Cercatelo con Google, ritardato! ©-
Re: [java] dubbio threadScritto da: gengiva
> ma ascolta, quando avvio un thread, questo muore da solo quando ha finito di fare le sue cose nè?
Si, se non ci sono referenze ad esso.
Senti, ma non hai un IDE in ordine, stile Eclipse, nel quale puoi debuggare ?`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
-
-
Re: [java] dubbio threadScritto da: gengiva
> Scritto da: ::1
> > Scritto da: gengiva
> > > ho un problema con delle animazioni
> > > immaginate uno spazio tridimensionale e un ipotetico personaggio che spara un proiettile identificato da un vettore
> > >
> > > il programma ha una funzione draw(), che funziona da loop per le animazioni in cui inserire tutto quello che dev'essere visualizzato e che fa da sola "l'update"
> > >
> > > se in questa funzione inserisco per esempio:
> > >
> > > if(MouseIsCliccato){spara();}
> > >
> > > e in spara() metto
> > >
> > > for(float i=0; i<100; i++){
> > > vettore=(x+i,y+i,z+i);
> > > disegnaProiettile(vettore);
> > > }
> > >
> > > funziona
> > > però mettiamo caso che questo proiettile debba muoversi lentamente, diminuireste l'incremento di i?
> > > no, perché il personaggio non potrebbe muoversi finché il ciclo for non è terminato.
> > >
> > > allora per ogni proiettile bisognerebbe creare un thread? si? no?
> > > perché se faccio:
> > >
> > > class proiettile extends Thread{
> > >
> > > [...]
> > >
> > > void run(){
> > > for(float i=0; i<100; i++){
> > > vettore=(x+i,y+i,z+i);
> > > disegnaPunto(vettore);
> > > sleep(200);
> > > }
> > > }
> > > }
> > >
> > > il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
> > > quindi il problema è che se in un programma ci sono più vettori che devono muoversi ecc, voi che siete degli informatici cervelloni e anche un po culattoni, come gestireste la faccenda
> > >
> > >
> >
> > A me sembra un problema di sincronizzazione degli accessi ad una variabile.
>
> il problema è che non saprei nemmeno quale sia la risorsa condivisa, perché il metodo si crea le sue cosine da solo e accede in sola lettura alle coordinate, mentre l'eccezione si propaga su per i metodi delle librerie che uso
>
> dovrei dichiarare il metodo Synchronized
Che libreria stai usando? In genere nella documentazione trovi dichiarato cosa sia thread-safe e cosa non lo sia.Young professional woman and busy mom.-
Re: [java] dubbio threadScritto dagengivaUtente privileggiatoil 2012-05-02 08:55:48.0 alle 2012-05-02 08:55:48.0Trollate totali: 9100Scritto da: ::1
> Scritto da: gengiva
> > Scritto da: ::1
> > > Scritto da: gengiva
> > > > ho un problema con delle animazioni
> > > > immaginate uno spazio tridimensionale e un ipotetico personaggio che spara un proiettile identificato da un vettore
> > > >
> > > > il programma ha una funzione draw(), che funziona da loop per le animazioni in cui inserire tutto quello che dev'essere visualizzato e che fa da sola "l'update"
> > > >
> > > > se in questa funzione inserisco per esempio:
> > > >
> > > > if(MouseIsCliccato){spara();}
> > > >
> > > > e in spara() metto
> > > >
> > > > for(float i=0; i<100; i++){
> > > > vettore=(x+i,y+i,z+i);
> > > > disegnaProiettile(vettore);
> > > > }
> > > >
> > > > funziona
> > > > però mettiamo caso che questo proiettile debba muoversi lentamente, diminuireste l'incremento di i?
> > > > no, perché il personaggio non potrebbe muoversi finché il ciclo for non è terminato.
> > > >
> > > > allora per ogni proiettile bisognerebbe creare un thread? si? no?
> > > > perché se faccio:
> > > >
> > > > class proiettile extends Thread{
> > > >
> > > > [...]
> > > >
> > > > void run(){
> > > > for(float i=0; i<100; i++){
> > > > vettore=(x+i,y+i,z+i);
> > > > disegnaPunto(vettore);
> > > > sleep(200);
> > > > }
> > > > }
> > > > }
> > > >
> > > > il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
> > > > quindi il problema è che se in un programma ci sono più vettori che devono muoversi ecc, voi che siete degli informatici cervelloni e anche un po culattoni, come gestireste la faccenda
> > > >
> > > >
> > >
> > > A me sembra un problema di sincronizzazione degli accessi ad una variabile.
> >
> > il problema è che non saprei nemmeno quale sia la risorsa condivisa, perché il metodo si crea le sue cosine da solo e accede in sola lettura alle coordinate, mentre l'eccezione si propaga su per i metodi delle librerie che uso
> >
> > dovrei dichiarare il metodo Synchronized
>
> Che libreria stai usando? In genere nella documentazione trovi dichiarato cosa sia thread-safe e cosa non lo sia.
processing
ho già guardato ma non ho trovato quello che cercavo, cmq ho messo dei flag a inizio e fine draw() e ora sembra andare, a parte qualche colpo a vuotoCercatelo con Google, ritardato! ©-
Re: [java] dubbio threadScritto da: gengiva
> ho già guardato ma non ho trovato quello che cercavo, cmq ho messo dei flag a inizio e fine draw() e ora sembra andare, a parte qualche colpo a vuoto
Posta il codice
!
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
-
-
-
-
Re: [java] dubbio threadScritto da: gengiva
> il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
Beh, dovresti identificare dove accade l'exception e perche'.
Secondo me due threads accedono alla medesima variabile (index) e la incrementano, andando ben oltre il limite concesso.`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
Re: [java] dubbio threadScritto da: gengiva
> ho un problema con delle animazioni
> immaginate uno spazio tridimensionale e un ipotetico personaggio che spara un proiettile identificato da un vettore
>
> il programma ha una funzione draw(), che funziona da loop per le animazioni in cui inserire tutto quello che dev'essere visualizzato e che fa da sola "l'update"
>
> se in questa funzione inserisco per esempio:
>
> if(MouseIsCliccato){spara();}
>
> e in spara() metto
>
> for(float i=0; i<100; i++){
> vettore=(x+i,y+i,z+i);
> disegnaProiettile(vettore);
> }
>
> funziona
> però mettiamo caso che questo proiettile debba muoversi lentamente, diminuireste l'incremento di i?
> no, perché il personaggio non potrebbe muoversi finché il ciclo for non è terminato.
>
> allora per ogni proiettile bisognerebbe creare un thread? si? no?
> perché se faccio:
>
> class proiettile extends Thread{
>
> [...]
>
> void run(){
> for(float i=0; i<100; i++){
> vettore=(x+i,y+i,z+i);
> disegnaPunto(vettore);
> sleep(200);
> }
> }
> }
>
> il proiettile va piano e il personaggio può spostarsi, ma se ne sparo una cifra a raffica, mi crasha tutto con un ArrayIndexOutOfBound brutto brutto..
> quindi il problema è che se in un programma ci sono più vettori che devono muoversi ecc, voi che siete degli informatici cervelloni e anche un po culattoni, come gestireste la faccenda
>
>
Sbagli candeggio secondo me.
Una cosa è lo stato del proiettile, un'altra quello del personaggio.
Il metodo (unico per tutti) che fa il draw deve querare lo stato di entrambe e disegnarli di conseguenza.
Il loop di un gioco è più o meno così:ripeti time = ora-time; input = leggieventualiinput(); aggiorna_stato_proiettile(input, time); aggiorna_stato_personaggio(input, time); .... (altri stati e oggetti animati da aggiornare) disegna_proiettile(); disegna_personaggio(); --- (altri oggetti da disegnare) until Esci;
Questo loop (semplificato) esiste praticamente in ogni videogame.
La variabile "time" tiene il numero di millisecondi passato dall'ultimo giro, questa è utile nel momento in cui aggiorni gli stati degli oggetti per sapere di quanto sono cambiati.
Non puoi accedere alle librerie grafiche da più thread contemporanei, qualsiasi siano i widget che usi hanno il limite di non essere in grado di funzionare chiamati da thread diversi, al massimo nei singoli thread puoi aggiornare lo stato degli oggetti ma solitamente non è necessario.
Le procedure aggiorna_stato_xxx() servono ad aggiornare le variabili interne (posizioni, orientamenti, altre variabili dipendenti dal tempo).
Le procedure disegna_xxx() servono unicamente a disegnare l'oggetto in base a quelle variabili (non aggiornano nessuno stato interno, ma lo usano per stabilire quale frame mostrare e dove).
Nota che con questo loop puoi avere oggetti che si aggiornano con tempistiche diverse, ma senza mai bloccare il ciclo di drawing o interferire con altri oggetti. Inoltre hai sempre un solo thread che accede alle librerie grafiche che in genere, anzi, sempre, non sono thread-safe ovvero non permettono l'accesso contemporaneo da parte di più thread ai loro metodi.
**Modificato dall'autore il 02.05.2012 09:21**
-