2014-01-17 100 views
2

爲什麼我的while循環凍結了我的程序?While Loop Stalling Program

gameLoop()支撐着我的其他程序進程。

while (running) { 
     if (Key.up) { 
      player.moveCharacter(1, playerSpeed); 
     } else if (Key.down) { 
      player.moveCharacter(2, playerSpeed); 
     } else if (Key.left) { 
      player.moveCharacter(3, playerSpeed); 
     } else if (Key.right) { 
      player.moveCharacter(4, playerSpeed); 
     } 
    } 

         // listen for log in data 
     while (true) { 
      try { 
       int direction = socketIn.readByte(); // player direction 
                 // sent from server 
       int px = socketIn.readByte(); // player px 
       int py = socketIn.readByte(); // player py 
       String username = socketIn.readUTF(); // player username 

       player = new Player(direction, px, py, username); // create 
       break; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       break; 
      } 
     } 
     game.gameLoop(player); 

game.gameLoop(player);就像你看到的那樣調用我的遊戲循環,但是當它運行時,我的遊戲繼續執行其他進程。有人可以告訴我爲什麼會發生這種情況嗎?我需要把它放在線程上嗎?

+0

因爲你處於gameLoop的連續循環中,即:'while(true)'without break condition。 –

+0

我已更新我的代碼。仍然不起作用。 – user3130731

回答

0

您使用while(true)永遠不會是錯誤的。因此,循環永遠不會中斷,並且您的代碼將永遠持續重複。

+0

我知道哈哈。這怎麼解決我的問題呢? – user3130731

+0

你需要給出一個實際的條件,而不是僅僅用'真'這個詞,在什麼樣的條件下你想要那個循環打破? –

+0

我已更新我的代碼。仍然不起作用。 – user3130731

0

您使用的是while (true),所以它會持續檢查密鑰狀態並執行代碼塊。而是每隔幾秒(或毫秒)檢查它們。

0

是的。如果你需要留在整個遊戲的循環中(登錄後),那麼你需要把它放在它自己的線程中。

1

您正在使用while(true),唯一走出循環的方法是使用break,但如果您在與管理GUI的線程相同的線程上有該代碼,則GUI將凍結,用戶將無法登錄,因爲該GUI被該循環凍結。

解決方法是在與主線程(管理GUI)不同的另一個線程上設置該代碼。

0

我知道我是一個幾年遲到了這一點,但希望它有助於任何閱讀

你可以使用一個標誌爲您while循環條件

flag = true; 
while(flag){ 

    //some code here 

    if(condition) 
     flag = false; 
} 

如果條件是條件退出循環,即當你退出循環時。