![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| shutffl |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Доброго времени суток!!
Жизнь заставила после 10 лет отбрыкивания от Java таки сесть за её изучение. И сразу же решил написать проект по работе дабы в боевых действиях познать прелести языка. Суть проблемы сводится к подвисанию GUI. Сразу привожу код. mWindow.java:
Canvas.java:
Прошу сильно не бить, ибо язык почти не знаю - могут быть серьезные огрехи, но логика есть логика. В данном примере, как это видно из кода, JPanel рисует 1000000 количество линий в области 300*300 пикселей. Это сделано для задержки. Как сделать, чтобы GUI реагировал во время рисования линий? То есть, чтобы работала нажатие на кнопку, считающую количество нажатий на ней. Это элементарный кусок кода, переписаный аналогчно (по принципу работы GUI) реальному приложению, которое должно обрабатывать в реальном времени изображение с камеры и делать фотки по нажатию на кнопку. Но и там, и там GUI просто висит. Знаю, что ответ где-то рядом. Подозреваю, что копать надо в сторону "Is Java threadsafely?". Но с потоками на Java пока туго, ибо куда их тут впихнуть - я хз. Заранее спасибо. --------------------
shadowmoon |
||||
|
|||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Рисовать линии в отдельном потоке на off-screen изображении и затем выводить на экран. Хотите видеть промежуточные результаты - отрисовывайте полуготовое изображение.
Про сам язык так говорить не слишком корректно. А вот про Swing, который Вы используете, можно сказать однозначно - небезопасен. Смотрите в сторону класса SwingWorker, который как раз предназначен для выноса тяжелых задач из EDT (основной поток Swing'а). Публикацию промежуточных результатов SwingWorker также поддерживает. Читать тут -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Спасибо, почитаю.
--------------------
shadowmoon |
|||
|
||||
| shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Хорошо, а если вместо заглушки вставить код на вывод потокового видео или аудио? Например, используя JavaCV или VLC Java binding?
--------------------
shadowmoon |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Цитирую документацию
так что здесь все уже cделано за Вас, этот компонент сам будет все отрисовывать. Это сообщение отредактировал(а) jk1 - 30.6.2011, 16:43 -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| aleksandy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 260 Регистрация: 17.12.2006 Репутация: 1 Всего: 5 |
||||
|
||||
| shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Спасибо, сейчас приступаю к ознакомлению. До этого писал нечто подобно на связке Qt + libvlc, но там был другой проект - радио. На Gtk+ так и не получилось адекватно реализовать потоки, чтобы GUI не подвисал. А тут решил под Android ПО пописать системное, а офф язык раработки только Java (C/C++ и python слишком коряво реализованы плюс в GUI все равно JavaScript-функция "биндится" для стороннего кода).
--------------------
shadowmoon |
|||
|
||||
| shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Да, но от требует NamedWindow, что для моих целей не годится. Грубо говоря, мне надо, чтобы было две компоненты 300*300 (реально 320*240) в горизонтальном layout, где в одном идет потоковое изображение с камеры, а во второй попадает изображение (фото) по нажатию кнопки. После этого фото можно сохранить. --------------------
shadowmoon |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Не прошло и недели, а мы уже выяснили в чем же состоит задача. А если серьезно, то вот что я могу Вам предложить. Запускаете отдельный SwingWorker, который читает с камеры и получает BufferedImage.
Прочитанные изображения публикуются как промежуточный результат (возможно пачками). Реализация метода process() в вашем SwingWorker() передает изображение панели и вызывает её принудительную перерисовку. А дальше надо будет смотреть, что выйдет. Если будут задержки и тормоза возможно придется прикрутить промежутчный буфер для изображений, а панель перерисовывать по таймеру. -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Спасибо. Про BufferedImage уже знал, так как само изображение получаю. Проблема была в том, что поток буфферизируется и изображения по клику мышки получаются не текущие (которых даже не видно), а следующие в потоке.
--------------------
shadowmoon |
|||
|
||||
| shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
На C++ (с GUI на Qt) уже все написал. Но хочу на Java.
--------------------
shadowmoon |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |