Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread(sleep), sleep 
:(
    Опции темы
Hacker_h
Дата 7.11.2005, 16:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, я пишу простейший апплет - змейку. у меня голова змеи - овал, который рисуется на панели через g.drawOval();
Змея - отдельный поток,который в своем вечном цикле сначала осуществляет движение (меняет коорлинаты на фиксированную величину)б затем засыпает на полсекунды, затем говорит обсерверу что изменился и хочет перерисоваться. Примерный кот такой:

while(alive){
move();
try{
Thread.sleep(SLEEP);

}catch(Exception e){
}
setChanged();
notifyObservers();
}

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


  Вверх
batigoal
Дата 7.11.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 7
Всего: 151



Запости код поподробнее. Весьма вероятно, что проблему можно будет решить с помощью EventQueue.invokeAndWait();

Это сообщение отредактировал(а) Lamer George - 7.11.2005, 17:01


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 14.11.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Почитай что-нибудь про анимацию (в частности в Java). Дело в том, что на выполнение треда процессор выделяет разное время, в зависимости от нагрузки; кроме того, сам слип не обязательно спит указанное время.
Обычно для исправления таких вещеи в этом цикле меряют реальное прошедшее время (t = System.currentTimeMillis - previousTime) и передвигают объект на расстояние v*t где v - скорость объекта.


--------------------

PM   Вверх
NextAlex
Дата 26.11.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: нет
Всего: 3



Привет!

Не советую для анимации использовать sleep() - в зависимости от параметров машины прорисовка занимает разное время, да и сам sleep() может спать разное время в зависимости от загрузки компа. Я с этими граблями уже сталкивался. Лучше используй для прорисовки таймер - swing-овский прост в использовании до безобразия и все проблемы сразу отпадут.
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Гость_Гость
Дата 1.12.2005, 13:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











NextAlex
Тоесть рисовать по таймеру?
  Вверх
NextAlex
Дата 2.12.2005, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: нет
Всего: 3



Цитата
Тоесть рисовать по таймеру?

Ну да ...
А почему тебя это удивляет ?
Всё что у тебя изменится - это добавится строка импорта
Код

import javax.swing.*;

добавится вот такой класс, причем прямо в теле класса твоего потока
Код

   class TimerDraw implements ActionListener {
       public void actionPerformed(ActionEvent event){
               move();
    }
   }

и объявление таймера и его старт при запуске потока (например ... или в любом другом удобном месте)
Код

   ActionListener tDraw = new TimerDraw();
   Timer tDraw = new Timer(500, tDraw);

        public void run(){
             tDraw.start();
        }


И всех делов smile
Зато ты четко будешь знать что между кадрами у тебя стабильный интервал в 500 миллисекунд ...

Это сообщение отредактировал(а) NextAlex - 5.12.2005, 10:59
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Domestic Cat
Дата 2.12.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Ага. А что, если скорость спрайта будет большой - не будел ли его движение прерывистым? Потом, все хендлеры для Timer выполняются в event-dispatching треде, а потому приложение в течение обработки событий таймера (а это время может быть значительным из-за рассчета движений объектов, проверки на столкновения, отрисовку, про 3D я молчу) на нажатия кнопок реагировать не будет.


--------------------

PM   Вверх
NextAlex
Дата 2.12.2005, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: нет
Всего: 3



Domestic Cat я тебе такую тирраду написал, но видать не совпало - не ту кнопку нажал ...
Повторяться мне лень...
В общем, ты сначала попробуй это сделать одним и вторым методом ...
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Domestic Cat
Дата 3.12.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Тем что я написал - делал 3D. Работало. Насчет твоего - не знаю и очень сомневаюсь.


--------------------

PM   Вверх
NextAlex
Дата 3.12.2005, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: нет
Всего: 3



А я пробовал и то и другое для 2D ... smile
В итоге остановился на таймере - работает гораздо стабильнее.
Кстати извини если разкий пост получился - я не со зла.
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Domestic Cat
Дата 4.12.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



2Д и я писал ( http://forum.vingrad.ru/index.php?showtopic=27244 ). Да я не обижаюсь, вполне возможно что и таймеры можно юзать.


--------------------

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.