2010-12-01 6 views
1

J'ai un OpenGL SurfaceView. Ceci doit maintenant être mis à jour par un événement externe arrivant sur un socket de réseau, ce socket de réseau s'exécute dans un thread externe, puisqu'il doit écouter à tout moment sur le port pour le trafic entrant, quand du trafic arrive un nouvel objet OpenGL devrait être créé et montré sur l'écran. Pour autant que je comprenne tout ce truc OpenGL, vous ne pouvez pas changer les objets d'un thread externe, mais avec queueevent() vous avez une chance. Mon code ressemble ce qui suit, mais unfortunatelly il isn ot travail:Android: OpenGL dans plusieurs threads

public class GameMain extends Activity { 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    glView=new GameView(this); 
    setContentView(glView); 
    } 
} 


public class MyGLSurfaceView extends GLSurfaceView{ 
    public MyGLSurfaceView(Context context) { 
    super(context); 
      renderer = new OpenGLRenderer(); 
      this.setRenderer(renderer); 
    } 
    public void do(ServerSocket ss){ 
     try{ 
    while(true){ 
      try { 
       ss.setSoTimeout(500); 
      Socket s = ss.accept(); 
          renderer.set(); 
         }catch(SocketTimeoutException e){} 
        } 
      }catch(Exception e){ 
        handleException(); 
    } 
    public void handleEvent(){ 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
       ServerSocket ss = new ServerSocket(7070); 
       while(true){ 
        get(ss); 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 
    queueEvent(t); 
    t.start(); 
} 
} 
public class OpenGLRenderer implements Rend{ 
Cube c = null; 
    public OpenGLRenderer(){ 
     //inits 
    } 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
      //..... 
    } 
    public void onDrawFrame(GL10 gl) { 
     if(c!=null) 
     doSth(); 
      //.... 
    } 
    public void set(){ 
     c = new Cube(); 
    } 
    } 

Ainsi l'ensemble() est appelée lorsque le trafic réseau arrive, mais unfortunatelly la variable locale c est pas mis à jour pour la méthode onDrawFrame() . Pourquoi est-ce le cas, comment puis-je y parvenir?

Quelqu'un peut-il m'aider s'il vous plaît?

Merci beaucoup Cordialement

Répondre

0

Qu'est-ce qui est avec ce queueEvent(t);? Comme je lis votre code, quelque chose appelle handleEvent() qui démarre un socket écoute ... quand quelque chose arrive sur ce socket, vous voulez ajouter un cube à votre affichage. Est-ce correct?

Si c'est le cas, c'est dans votre thread d'écoute de socket que vous souhaitez envoyer un message au thread de rendu via queueEvent(), et ne lui envoyez pas la fonction de thread à exécuter! Lorsque votre code est affiché, vous exécutez votre fonction d'écoute de socket deux fois ... une fois sur le thread dédié, une fois sur le thread de rendu (!).

0

ok, quand je vous reçois droit vous que le code devrait ressembler à ceci ?:

public class MyGLSurfaceView extends GLSurfaceView{ 
public MyGLSurfaceView(Context context) { 
super(context); 
     renderer = new OpenGLRenderer(); 
     this.setRenderer(renderer); 
} 
public void do(ServerSocket ss){ 
    try{ 
while(true){ 
     try { 
      ss.setSoTimeout(500); 
      Socket s = ss.accept(); 
      queueEvent(new Runnable() { 
     @Override 
     public void run() { 
        renderer.set(); 
     } 
    }); 
     }catch(SocketTimeoutException e){} 
    } 
     }catch(Exception e){ 
       handleException(); 
} 
public void handleEvent(){ 
Thread t = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try{ 
      ServerSocket ss = new ServerSocket(7070); 
      while(true){ 
       get(ss); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
}); 
t.start();} } 

Unfortunatelly ce isnt travail ainsi; Apparemment même la méthode set() n'est pas appelée dans ce cas.

btw: le handleEvent() est appelé à la fin de GameMain.

+0

Et qu'est-ce que GameMain? Quand est-ce que() est appelé? Quelle est la durée de vie prévue de votre fil d'écoute de socket? Vous devez définir des points d'arrêt et rechercher dans le débogueur ... –