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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два метода paint 
:(
    Опции темы
GavriKos
Дата 24.8.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток! Немного запутался в одной вещи, помогите разобраться.

Есть главный клас мидлета. В нем есть метод paint, который вызывается каждые 10 милисекунд (при помощи треда). Есть второй класс, в котором тоже есть метод paint. Суть в том, что при определенном событии метод paint второго класса должен вызываться определенное количество раз с задержкой 10 милисекунд. 

Я решил эту проблемму так - в первом классе в методе paint поставил счетчик, который каждый раз нарасщивается и при этом вызывается paint второго класса. Когда счетчик достигнет нужной величины - он нулится и paint из второго класса не вызывается:

Код

        if (flagDestroyStone==true)
        {
            if (calcFrames!=16) {exploided.paint(g); calcFrames++;}
            else {calcFrames=0;flagDestroyStone=false;}            
        }


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

Код

s.paint(g);
         s.nextFrame();
         try{
         wait(10);
         } catch (InterruptedException ie) {}
         paint(g);


Но каждый раз при входе в paint вызывался какой-то ексепшн (конкретно - IllegalMonitorStateException). Подскажите, как лучше поступить, в каком направлении копать?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Antropoid
Дата 25.8.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



wait(10); нужно помещать в synchronized блок, или метод paint(), в котором это присутствует делать synchronized


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
GavriKos
Дата 25.8.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, вечером попробую.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
GavriKos
Дата 26.8.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В общем на wait больше не ругается, но от этого не легче. Написал вот такой код:

Код

    public synchronized void paint(Graphics g)
    {    if (bufFrame!=16)
         {
         s.paint(g);
         s.nextFrame();
         
         try{
         wait(50);
         } catch (InterruptedException ie) {}
         bufFrame++;
         paint(g);
         }
         else bufFrame=0;
    }


При вызове этого пеинта намертво замораживается все приложение на 50мс. Пробовал поставить в главном классе где-нибудь synhronized (в run,  в paint) - не помогло.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
W0LF
Дата 27.8.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



а в каком потоке вызывается paint()? в главном? дай больше кода, покажи где вызывается paint? 


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
GavriKos
Дата 27.8.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



paint второго метода вызывается в общем потоке. Код дать не могу, его много чистить долго. 
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Dummy
Дата 27.8.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

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



Цитата(GavriKos @  26.8.2008,  10:18 Найти цитируемый пост)
При вызове этого пеинта намертво замораживается все приложение на 50мс

А что, ожидалась какая-то другая реакция при заморозке рабочего потока на 50 мс?smile 
PM MAIL   Вверх
GavriKos
Дата 29.8.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Стоп. wait замораживает выполнение текущего потока, даже если находится в другом классе и т.д? А как тогда решить этот вопрос? Вынести в отдельный поток второй класс?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
W0LF
Дата 29.8.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



хм. ты не путай потоки и классы
конечно все надо выносить из главного треда


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
GavriKos
Дата 30.8.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вынес весь класс в отдельный поток. Получилось вот что:


Код

    public void paint(Graphics g)
    { 
        System.out.println("!!!ENTER PAINT!!!");
        s.paint(g);
    }
    
    public void run()
    {
        repaint();
        try{
        Thread.sleep(10);
        } catch (InterruptedException ie) {}
        run();
    }


Поток, естественно, запускаю (он запускается 100%, проверял). Вот только почему то в метод paint приложение не заходит. Пробовал this.paint - эффект тот же. Пробовал вместо repaint писать paint, в который Graphics передавал из главного класса - в метод тогда заходит, но ничего не рисует. Ткните носом. где ошибка. Или скажите хотя б, куда копать?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Antropoid
Дата 30.8.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Рискну угадать  smile 
что делать нужно так:
Код

class YourClass extends Canvas implements Runnable {
...
}



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
GavriKos
Дата 31.8.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Блин понятное дело что это сделано smile Так что не угадал. Вот полностью код класса, там правда может что то лишнее - чистить долго...

Код

public class SpritePlayer extends Canvas implements Runnable
{
    Sprite s;
    Image i; 
    int animDelay;
    int playType;
    //Graphics G;
    int bufFrame;
    
    boolean flagStop=false;
    
    public final int PLAY_TYPE_ONCE=1;
    public final int PLAY_TYPE_CIRCLE=2;
    Thread th;
    public SpritePlayer(String ResourseName,int FrameRate,int posX,int posY)
    {
        bufFrame=0;
        try{
            i = Image.createImage(ResourseName);            
        } catch (IOException ioe) {System.out.println("error");}  
        s = new Sprite(i, i.getWidth()/FrameRate, i.getHeight());
        s.setRefPixelPosition(posY, posY);
        th = new Thread(this);
        th.start(); 
    }
    
    public void paint(Graphics g)
    { 
        System.out.println("!!!ENTER PAINT!!!");
        s.paint(g);
    }
    
    public void run()
    {
        repaint();
        try{
        Thread.sleep(10);
        } catch (InterruptedException ie) {}
        run();
    }
    
    public void start()
    {    
           
       //th.notify();
        
        //paint(g);           
    }
}

--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
GavriKos
Дата 31.8.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



поправка - этод код один раз заходит в paint.

Добавлено через 2 минуты и 34 секунды
только вот не из-за repaint  в run...
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Dummy
Дата 31.8.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

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



Вызов repaint() для канвы не означает моментального вызова paint() - это только постановка запроса на перерисовку в общую очередь графической системы. Через какое время после вызова repaint() будет вызван paint() - точно угадать не возможно. Чтобы заставить графическую систему JVM немедленно обслужить все возможные repaint()'ы, нужно вызвать Canvas.serviceRepaints()

Это сообщение отредактировал(а) Dummy - 31.8.2008, 16:24
PM MAIL   Вверх
Antropoid
Дата 31.8.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



If the canvas is not visible, or if width and height are zero or less, or if the rectangle does not specify a visible region of the display, this call has no effect.
SpritePlayer должен быть на экране
Код

Display.getDisplay(YourMidletClass.getInstance()).setCurrent(new SpritePlayer()); 


Добавлено через 3 минуты и 28 секунд
Dummy, ему это не поможет, ибо
If there are no pending repaints, or if this canvas is not visible on the display, this call does nothing and returns immediately.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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