2010-12-01 9 views
1

私はOpenGL SurfaceViewを持っています。これは、ネットワークポートを経由する何らかの外部イベントによって更新される必要があります。このネットワークソケットは外部スレッドで動作しています。着信トラフィックのためにポートで常時待ち受ける必要があるため、トラフィックが到着したときに新しいOpenGLオブジェクトを作成する必要があります。画面に表示されます。 私はすべてのOpenGLのものを理解する限り、オブジェクトを外部スレッドから変更することはできませんが、queueevent()を使用するとチャンスがあります。 私のコードは次のように見えますが、生憎それがot作業をにISN:だからAndroid:いくつかのスレッドでOpenGL

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(); 
    } 
    } 

セット()メソッドは、トラフィックが到着するネットワーキングときに呼び出されますが、生憎ローカル変数cがonDrawFrame()メソッドのために更新されません。それはなぜですか、どうすればこれを達成できますか?

誰でも私を助けてくれますか?

どうもありがとう よろしく

答えて

0

そのqueueEvent(t);とは何?私があなたのコードを読んでいるうちに、何かがソケットリッスンを開始するhandleEvent()を呼び出しています。そのソケットに何かが到着したら、ディスプレイにキューブを追加します。そうですか?

もしそうなら、ソケットリッスンスレッドに、queueEvent()経由でレンダリングスレッドにメッセージを送信し、実行するスレッド関数を送信しないようにしてください!コードが立っているので、ソケットリスニング関数を2回実行しています...専用スレッドで1回、レンダリングスレッドで1回(!)。私は右のあなたを取得していたときに

0

okが、あなたのコードは次のようになりますと仮定?:

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();} } 

生憎、このありえないが、同様の作業します。このケースでは、set()メソッドも呼び出されません。

btw:handleEvent()は、GameMainの最後に呼び出されます。

+0

GameMainとは何ですか? do()はいつ呼ばれますか?あなたのソケットリスニングスレッドの予想寿命はどれくらいですか?いくつかのブレークポイントを設定し、デバッガで調査する必要があります... –

関連する問題