forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Аналог паскалевского Delay без введения потока. (http://forum.boolean.name/showthread.php?t=7346)

Phantom 18.11.2008 04:43

Аналог паскалевского Delay без введения потока.
 
Можно ли как-нибудь сделать задержку при выполнении программы без введения потока?

Doctor Drive 17.03.2011 17:19

Ответ: Аналог паскалевского Delay без введения потока.
 
Thread.currentThread().sleep(1000);

Romanzes 18.03.2011 00:55

Ответ: Аналог паскалевского Delay без введения потока.
 
sleep(int millis) - это статический метод класса Thread, поэтому можно обращаться просто как Thread.sleep(1000); И InterruptedException ловить не забываем.

Phantom 18.03.2011 00:56

Ответ: Аналог паскалевского Delay без введения потока.
 
Два с половиной года, блеать, я ждал ответа на этот вопрос. Спасибо вам, парни, теперь я могу спокойно спать по ночам. :super:

Zorko 23.01.2014 16:53

Ответ: Аналог паскалевского Delay без введения потока.
 
Всем привет! Накопилась парочка вопросов.

Цитата:

Сообщение от Romanzes (Сообщение 183125)
И InterruptedException ловить не забываем.

Вопрос №1: насколько важно ловить InterruptedException в данном случае? Я смотрел чужие исходники на Java ME и видел как люди часто пихают обработку исключений где надо и где не надо. Не то чтобы я не сторонник такого подхода, надёжность важнее, но интересно знать наверняка какие именно исключения могут прийти при вызове Thread.sleep на реальном железе? Что именно может помешать телефону впасть в спячку?

Вопрос №2: допустимо ли, ожидая событие (например, нажатие кнопки), периодически опрашивать состояние события (переменной, которую устанавливает метод lcdui.Canvas.keyPressed в отдельном потоке) с последующим засыпанием на 1 мс по Thread.sleep(1)? Т.е. не будет ли такой код создавать излишнюю нагрузку на телефон? (ну может лучше до 10 мс увеличить время ожидания, например):

Код:

  while(!keyPressed) {
    try
    {
      Thread.sleep(1);
    }
    catch (InterruptedException e)
    {
      ;
    }
  }

Приветствуются компетентные ответы. Неохота работать наобум, интересно узнать что происходит на самом деле. :)

Igor 25.01.2014 02:29

Ответ: Аналог паскалевского Delay без введения потока.
 
Я пишу метод, чтобы не писать по нескольку раз 4 строчки.
PHP код:

protected void delay(long time) {
        try {
            
Thread.sleep(time);
        } catch (
InterruptedException e) {
        }
    } 

Есть смутное подозрение, что время сна округляется до неких значений. Лучше всего вручную взять и померять - засечь время выполнения 100 вызовов delay(1).
Время реакции человека порядка 100мсек. (А иначе в спорте засчитывают фальшстарт) Экран обновляется порядка 20-40 мсек, т.е, обновляться бегать в цикло сильно чаще смысла нет. 10-20 мсек точно хватит, меньше нет смысла делать.
P.S. Насколько delay(1) хуже для батареи телефона - не понятно. Наверно, разницы практически нет.

Жека 25.01.2014 06:50

Ответ: Аналог паскалевского Delay без введения потока.
 
Canvas.keyPressed - это системная функция, она и так в отдельном потоке обрабатывается. Внутрь этой функции не нужно помещать логику программы, здесь нужно запомнить нажатую кнопку, и логику нажатия обрабатывать в твоем главном цикле.

SBJoker 25.01.2014 12:12

Ответ: Аналог паскалевского Delay без введения потока.
 
Цитата:

Сообщение от Igor (Сообщение 273020)
Экран обновляется порядка 20-40 мсек, т.е, обновляться бегать в цикло сильно чаще смысла нет. 10-20 мсек точно хватит, меньше нет смысла делать.
P.S. Насколько delay(1) хуже для батареи телефона - не понятно. Наверно, разницы практически нет.

Обычно операционные системы с вытесняющей многопоточностью по команде delay передают управление следующему в очереди потоку, так же обычно квант времени в таких системах значительно превышает 1мс, и нередко составляет около 10мс и больше. Некоторые потоки могут дополнительно удерживать процессор, что увеличивает время их монопольного владения.

Следовательно никак нельзя быть уверенным что delay будет создавать именно указанную задержку, особенно если она мала. Разница между delay(1) и delay(100) только в том насколько много процессов успеют выполнится в этот промежуток времени.

Zorko 30.01.2014 00:49

Ответ: Аналог паскалевского Delay без введения потока.
 
Кстати, есть ещё Thread.yield()
Но не знаю насколько есть смысл в этом методе именно на Java ME.

Жека, я не помещаю логику программы внутрь Canvas.keyPressed.
Моя keyPressed это переменная, которая устанавливается внутри Canvas.keyPressed. Если код кажется слегка не таким как вы привыкли, то это потому что я его на Java переписал чтобы вам было лучше понятно.

Жека 30.01.2014 07:26

Ответ: Аналог паскалевского Delay без введения потока.
 
Цитата:

Сообщение от Zorko (Сообщение 273289)
Жека, я не помещаю логику программы внутрь Canvas.keyPressed.
Моя keyPressed это переменная, которая устанавливается внутри Canvas.keyPressed. Если код кажется слегка не таким как вы привыкли, то это потому что я его на Java переписал чтобы вам было лучше понятно.

окей:) я так, на всякий случай заострил внимание.
у меня в проге была проблема - метод keyPressed() прерывал выполнение paint().
Цитата:

Сообщение от Zorko (Сообщение 273289)
Кстати, есть ещё Thread.yield()
Но не знаю насколько есть смысл в этом методе именно на Java ME.

Новые версии NetBeans, в частности 7.4, подчёркивают строку Thread.yield() и говорят вот что:
Код:

Invocation of method yield() on java.lang.Thread is usually used to masquerade synchronization problems and should be avoided.
рекомендует избегать этот метод.
как оно на самом деле, и тем более в джава-машинах разных телефонов - не ясно.


Часовой пояс GMT +4, время: 16:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot