![]() |
Модераторы: javastic, AntonSaburov |
![]() ![]() ![]() |
|
GavriKos |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
Доброго времени суток! Немного запутался в одной вещи, помогите разобраться.
Есть главный клас мидлета. В нем есть метод paint, который вызывается каждые 10 милисекунд (при помощи треда). Есть второй класс, в котором тоже есть метод paint. Суть в том, что при определенном событии метод paint второго класса должен вызываться определенное количество раз с задержкой 10 милисекунд. Я решил эту проблемму так - в первом классе в методе paint поставил счетчик, который каждый раз нарасщивается и при этом вызывается paint второго класса. Когда счетчик достигнет нужной величины - он нулится и paint из второго класса не вызывается:
В принципе все работает, но вот хотелось бы перенести эту всю конструкцию во второй класс, чтоб в первом можно было запустить отрисовку второго класса одним методом. Пробовал через потоки, но сразу потерпел неудачу - если событие приходит второй раз (т.е. второй раз должен запустится цикл отрисовки), то вылетает ексепшн мол поток уже запущен, второй раз не запустится. Пробовал что то вроде такого:
Но каждый раз при входе в paint вызывался какой-то ексепшн (конкретно - IllegalMonitorStateException). Подскажите, как лучше поступить, в каком направлении копать? --------------------
Донецкая группа IT - присоединяемся |
||||
|
|||||
Antropoid |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 786 Регистрация: 1.6.2006 Где: &Ukraine==Ode ssa Репутация: 13 Всего: 16 |
wait(10); нужно помещать в synchronized блок, или метод paint(), в котором это присутствует делать synchronized
-------------------- ![]() Задыхаясь от восторга заниматься чепухой. |
|||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
Спасибо, вечером попробую.
--------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
В общем на wait больше не ругается, но от этого не легче. Написал вот такой код:
При вызове этого пеинта намертво замораживается все приложение на 50мс. Пробовал поставить в главном классе где-нибудь synhronized (в run, в paint) - не помогло. --------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
а в каком потоке вызывается paint()? в главном? дай больше кода, покажи где вызывается paint?
-------------------- iOS developer |
|||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
paint второго метода вызывается в общем потоке. Код дать не могу, его много чистить долго.
--------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
Dummy |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 7 Всего: 19 |
||||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
Стоп. wait замораживает выполнение текущего потока, даже если находится в другом классе и т.д? А как тогда решить этот вопрос? Вынести в отдельный поток второй класс?
--------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
хм. ты не путай потоки и классы
конечно все надо выносить из главного треда -------------------- iOS developer |
|||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
Вынес весь класс в отдельный поток. Получилось вот что:
Поток, естественно, запускаю (он запускается 100%, проверял). Вот только почему то в метод paint приложение не заходит. Пробовал this.paint - эффект тот же. Пробовал вместо repaint писать paint, в который Graphics передавал из главного класса - в метод тогда заходит, но ничего не рисует. Ткните носом. где ошибка. Или скажите хотя б, куда копать? --------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
Antropoid |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 786 Регистрация: 1.6.2006 Где: &Ukraine==Ode ssa Репутация: 13 Всего: 16 |
Рискну угадать
![]() что делать нужно так:
-------------------- ![]() Задыхаясь от восторга заниматься чепухой. |
|||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
Блин понятное дело что это сделано
![]()
--------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
GavriKos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
поправка - этод код один раз заходит в paint.
Добавлено через 2 минуты и 34 секунды только вот не из-за repaint в run... --------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
Dummy |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 7 Всего: 19 |
Вызов repaint() для канвы не означает моментального вызова paint() - это только постановка запроса на перерисовку в общую очередь графической системы. Через какое время после вызова repaint() будет вызван paint() - точно угадать не возможно. Чтобы заставить графическую систему JVM немедленно обслужить все возможные repaint()'ы, нужно вызвать Canvas.serviceRepaints()
Это сообщение отредактировал(а) Dummy - 31.8.2008, 16:24 |
|||
|
||||
Antropoid |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 должен быть на экране
Добавлено через 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. -------------------- ![]() Задыхаясь от восторга заниматься чепухой. |
|||
|
||||
![]() ![]() ![]() |
FAQ раздела лежит здесь! |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |