Вниз  Java-программирование (1-ые посты)
- 2.11.2013 / 00:02
Naik
  Пользователь

Naik 
Сейчас: Offline
Такая проблема: методы keyPressed и keyReleased устанавливают флаг, а в
отдельном треде уже в зависимости от кнопки просчитываются новые координаты и вызывается repaint().
  1.     public void keyRepeated(int keyCodeNew) {
  2.         keyCode = keyCodeNew;
  3.         oneClick = false;
  4.         pressedMove = true;
  5.     }
  6.  
  7.     public void keyReleased(int keyCode) {
  8.         pressedMove = false;
  9.     }
  10.     public void run() {
  11.         while (running) {
  12.                     if (pressedMove) {
  13.                 if (keyCode == KEY_NUM4) {
  14.                     mapX = mapX <= 0 ? 0 : mapX - 1;
  15.                     updateGraphics();
  16.                 } else if (keyCode == KEY_NUM2) {
  17.                     mapY = mapY <= 0 ? 0 : mapY - 1;
  18.                     updateGraphics();
  19.                 } else if (keyCode == KEY_NUM6) {
  20.                     mapX = mapX >= w ? w : mapX + 1;
  21.                     updateGraphics();
  22.                 } else if (keyCode == KEY_NUM8) {
  23.                     mapY = mapY >= h ? h : mapY + 1;
  24.                     updateGraphics();
  25.                 }
  26.                 if (oneClick) {
  27.                     pressedMove = false;
  28.                 }
  29.                 // от закоментированной задержки зависит синхронизация этого треда и отрисовки
  30.                 // не подходит, потому что задержку нужно подбирать под каждый телефон..
  31.                           //try {
  32.                           //    Thread.sleep(1);
  33.                         //} catch (InterruptedException ex) {}
  34.             } else {
  35.                 try {
  36.                     Thread.sleep(1);
  37.                 } catch (InterruptedException ex) {}
  38.             }
  39.         }
  40.     }
  41.  
  42.     private void updateGraphics() {
  43.         curX = getXOnScreen(mapX);
  44.         curY = getYOnScreen(mapY);
  45.         repaint();
  46.     }
     Проблема в том, что paint(Graphics g) выполняется намного дольше чем просчет новых координат,
поэтому пока отрисуется один кадр, уже просчитаны координаты далеко вперед и следующий кадр «перескакивает».
     Пробовал в методе paint сделать synchronized блок на переменную pressedMove - ничего не изменилось. Делал synchronized paint(...) тоже самое..
     Получилось только через еще один флаг paintInProgress.
     Как сделать синхронизацию через synchronized блок или метод?
- 2.11.2013 / 00:10
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, а почему ты synchronized в paint ставишь? Ты же переменные в keyPressed и keyReleased изменяешь, вот там и пробуй. А, и в run надо, там тоже изменяется переменная.
Не совсем понял, архитектуру данного решения. Почему переменные устанавливаются в keyPressed, влияют на paint, а проверяются вообще в отдельном потоке?
__________________
 let live

Изменено aNNiMON (2.11 / 00:12) (всего 1 раз)
- 2.11.2013 / 06:11
gost6678
  Пользователь

gost6678 
Naik, попробывал уменьшить размер сохраняемой картинки- сохранило нормально! Спасибо.
- 2.11.2013 / 06:14
gost6678
  Пользователь

gost6678 
Naik, вот пример синхронизированного метода:
synchronized void method1(){
}

Изменено gost6678 (2.11 / 06:14) (всего 1 раз)
- 2.11.2013 / 12:56
Naik
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, в keyPressed устанавливается код кнопки полю класса и вспомог. переменные. Нажатие обрабатывается в отдельном треде чтобы облегчить методы keyPressed, keyReleased. Получается в главный поток занят только отрисовкой, а в другом производятся все вычисления.

Вот здесь советуют писать как можно более быстровыполняемые методы, которые вызываются системой (keyPressed, etc) — http://www.mobilab.ru/articles/4/
- 2.11.2013 / 13:17
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
Naik, там какая-то беда с системными вызовами. поставил небольшой сон в методе paint, мидлет поспал и потом вывел всё сразу, хотя должно было вылезти по очереди. надо поманипулировать с вызовами системнымных методов, тесты погонять.
__________________
 знает толк
- 2.11.2013 / 13:27
Naik
  Пользователь

Naik 
Сейчас: Offline
Короче сделал без всяких synchronized. Синхронизирую вручную с пом. paintInProcess:
Открыть спойлер
Теперь как и нужно на каждое изменение координат приходится одно выполнение paint.
- 2.11.2013 / 14:48
gost6678
  Пользователь

gost6678 
Молодец!
- 2.11.2013 / 15:27
Nokia_372Oc
  Пользователь

Nokia_372Oc 
Соберите плиз!


Прикрепленные файлы:
src.zip (1.42 кб.) Скачано 18 раз
- 2.11.2013 / 18:27
gost6678
  Пользователь

gost6678 
Nokia_372Oc, собрал, только исправил неправильный доступ к переменной ln из главного класса на такой:
Main.m.ln


Прикрепленные файлы:
Main.jar (2.73 кб.) Скачано 119 раз
Наверх  Всего сообщений: 16875
Фильтровать сообщения
Поиск по теме
Файлы топика (794)