Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    gengiva
    Utente privileggiato
    il 2012-05-02 08:14:54.0 alle 2012-05-02 08:14:54.0
    Trollate totali: 9100
    [java] dubbio thread
    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 faccendaNewbie, inesperto

    Cercatelo con Google, ritardato! ©
    • Avatar
      ☺
      Scritto da
      ::1
      il 2012-05-02 08:21:34.0 alle 2012-05-02 08:21:34.0
      Trollate totali: 12321
      Re: [java] dubbio thread
      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 faccendaNewbie, inesperto
      >
      >

      A me sembra un problema di sincronizzazione degli accessi ad una variabile.
      Young professional woman and busy mom.
      • Avatar
        ☺
        Scritto da
        gengiva
        Utente privileggiato
        il 2012-05-02 08:32:27.0 alle 2012-05-02 08:32:27.0
        Trollate totali: 9100
        Re: [java] dubbio thread
        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 faccendaNewbie, inesperto
        > >
        > >
        >
        > 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 A bocca storta

        dovrei dichiarare il metodo SynchronizedNewbie, inesperto
        Cercatelo con Google, ritardato! ©
        • Avatar
          ☺
          Scritto da
          ::1
          il 2012-05-02 08:53:50.0 alle 2012-05-02 08:53:50.0
          Trollate totali: 12321
          Re: [java] dubbio thread
          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 faccendaNewbie, inesperto
          > > >
          > > >
          > >
          > > 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 A bocca storta
          >
          > dovrei dichiarare il metodo SynchronizedNewbie, inesperto

          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.
          • Avatar
            ☺
            Scritto da
            gengiva
            Utente privileggiato
            il 2012-05-02 08:55:48.0 alle 2012-05-02 08:55:48.0
            Trollate totali: 9100
            Re: [java] dubbio thread
            Scritto 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 faccendaNewbie, inesperto
            > > > >
            > > > >
            > > >
            > > > 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 A bocca storta
            > >
            > > dovrei dichiarare il metodo SynchronizedNewbie, inesperto
            >
            > 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 vuoto
            Cercatelo con Google, ritardato! ©
    • Avatar
      ☺
      Scritto da
      il 2012-05-02 08:34:34.0 alle 2012-05-02 08:34:34.0
      Trollate totali: 42885
      Re: [java] dubbio thread
      Scritto 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
    • Avatar
      ☺
      Scritto da
      il 2012-05-02 09:20:32.0 alle 2012-05-02 09:20:32.0
      Trollate totali: 6532
      Re: [java] dubbio thread
      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 faccendaNewbie, inesperto
      >
      >

      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**
<softv>

Pagina generata in 148 millisecondi

Utenti attivi: 13 nell'ultimo minuto, 28 negli ultimi cinque minuti, 52 negli ultimi 15 minuti