2015-01-26 4 views
-1
boolean bury = false; 
long lastAction = 0; 
if (inputString.startsWith("::bury")) { 
    bury = !bury; 
    while (bury) { 
     if (System.currentTimeMillis() - lastAction > 500) { 
      stream.createFrame(122); 
      stream.method433(atInventoryInterface); 
      stream.method432(0); 
      stream.method431(Integer.parseInt(inputString.substring(7))); // Item ID 
      lastAction = System.currentTimeMillis(); 
     } 
    } 
} 

Итак, я играю в игру, отправляя фиктивные пакеты, чтобы сделать мою жизнь проще, как любой ребенок. Проблема в том, что автотаймер отправляет команду для меня, не позволяет мне общаться с другими игроками.В то время как цикл вызывает крушение

Это то, куда приходит цикл while. Я пытаюсь поместить код в бесконечный цикл (вызывая код каждые полсекунды), но когда я пытаюсь выполнить этот процесс, вся игра замерзает.

Я признаю, что я никогда не использовал цикл while, поэтому, возможно, я просто не понимаю его достаточно хорошо, но он должен работать, нет?

+0

Как раз в сторону, существует разница между крушением и замораживанием. Сбой, как правило, означает, что ошибка возникает, замораживание - это программа, не отвечающая. –

+2

Ввод кода в бесконечный цикл не позволит остальной части игрового движка запускаться, если это не сделано в другом потоке. –

ответ

0

Поместите эту петлю в новую тему. Кажется, ваша петля находится внутри основного потока, и поэтому бесконечный цикл останавливает всю программу.

+0

новый Тема: хорошо. Но не зацикливайтесь на ожидание. Используйте Thread # sleep как минимум. – Thilo

0

Вы можете использовать что-то наподобие sleep(0.5), чтобы замедлить цикл.

+1

но _ «Я пытаюсь поместить код в бесконечный цикл» _ –

+0

бесконечный цикл замерзает вашу программу! Он замораживает каждую программу! Если вы не задерживаете там, чем можете уменьшить скорость его работы. – Armin

+0

Хорошо, да. Я думал, что это необходимо для того, чтобы убить процесс. Если бы я просто использовал 'System.currentTimeMillis() - lastAction> 500', у меня не было бы никакого значения, когда он выключится. Правильно? – Nicholas

1

Вы не можете сделать это в потоке обработки основного события в приложении GUI. Все методы должны делать что-то и быстро возвращаться, чтобы пользовательский интерфейс мог перерисовывать и другие события могли быть отправлены.

Что вы ищете, это таймер, который выполняет некоторые повторные работы по расписанию. Ваша инфраструктура графического интерфейса должна предлагать средства для их управления.

Эти таймеры также избегают необходимости «ожидания», что и делает ваша петля. Даже если блокирование остального мира не будет проблемой, это огромная трата процессора (и электричества). Вместо того, чтобы смотреть на время каждую наносекунду или так в замкнутом цикле, вы можете запланировать таймер для «в 500 миллисекунд».

0

Используйте Thread.sleep(500);, чтобы сделать нить посреди полсекунды. вместо цикла. но проблема в другом месте!

0

Вам нужно поместить код, запущенный в бесконечном цикле, в какой-то фоновый поток, отличный от основного потока, где остальная часть кода запущена, а затем получить результаты от этого.

Смежные вопросы