2011-08-15 15 views
1
public class GameLoopThread extends Thread 
    { 
    static final long FPS = 10; 
    private GameView view; 
    private boolean running = false; 
    public GameLoopThread(GameView view) 
    { 
     this.view = view; 
    } 
    public void setRunning(boolean run) 
    { 
     running = run; 
    } 
    @Override 
    public void run() 
    { 
     long ticksPS = 1000/FPS; 
     long startTime; 
     long sleepTime; 
     while (running) 
     { 
       Canvas c = null; 
       startTime = System.currentTimeMillis(); 
       try 
       { 
         c = view.getHolder().lockCanvas(); 
         synchronized (view.getHolder()) 
         { 
           view.onDraw(c); 
         } 
       } 
       finally 
       { 
         if (c != null) 
         { 
           view.getHolder().unlockCanvasAndPost(c); 
         } 
       } 
       sleepTime = ticksPS-(System.currentTimeMillis() - startTime); 
       try 
       { 
         if (sleepTime > 0) 
           sleep(sleepTime); 
         else 
           sleep(10); 
       } 
       catch (Exception e){ 

       } 
      } 
     } 
    } 

私の混乱は私が初期化したことを意味します。その後 私が割り当てられた - ?>setRunning(boolean run)メソッドを理解する上での問題

public void setRunning(boolean run) 
    { 
     running = run; 
    } 

ので、どのような「実行すると、」本当に「実行」の谷ものですsombodyプラザsetRunning(ブール実行)する方法を説明し、保持しています。

+4

あなたはスレッドをプログラミングしていますが、このような単純なセッターメソッドが何か分かりません。犯行はありませんが、基本的にはまずhttp://download.oracle.com/javase/tutorial/java/index.htmlから始めてください。スレッドは非常に複雑な問題です。 –

+1

'running'が' volatile'と宣言されていないので( 'setRunning(...)'が別のスレッドによって呼び出されると仮定して)、このクラスはとにかく壊れています。 – mre

+1

実行はすでにfalseと宣言されています。親愛なるfrend .. private boolean running = false; – sanjay

答えて

0

runは、setRunning()メソッドの引数として渡すものはすべて保持します。 trueまたはfalseのいずれかになります。

コードの外観からは、Canvasの再描画を制御しているようです。 runningtrueThreadにはsetRunning(true)を呼び出すことによって)である限り、を100 ms(または毎秒10フレーム)ごとに再描画します。あなたは適切な同期が発生するためにvolatile修飾子を使用してrunningを宣言する必要があります

EDIT

。修飾子を含まず、別のスレッドからsetRunning()を呼び出した場合、「期待される」結果は保証されません。

hereを参照してください。

+0

あなたは何をしようとしていますか..しかし、私の問題は、setRunningメソッド内の実行変数が保持するものです。実行が既にfalseに初期化されているので... – sanjay

+0

'' false''に初期化されている場合、 '' setRunning(true) ''を呼び出すまでは、それは常に '' false''です。 –

+0

実行が初期化されても。それは実行されているものに変更されます。 – user802421

0

キャンバスが配置され、スプライトが設定された後にのみ、GameLoopThreadを開始するためにskbishiを使用することができますか?

関連する問題