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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трудозатратная задача отрисовки графики и progress 
V
    Опции темы
CHEM_Eugene
Дата 5.10.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть некоторая Task implements Runnable, которая выполняется через SwingUtilities.invokeLater

внутри этой таски есть несколько вызовов методов, которые трудозатратны, но они отрисовывают GUI.

Я показываю progress bar, но он работает не так как надо - прогресс показывается только после завершения всей таски, а не после каждого этапа.

Код примерно такой:
Код

Task implements Runnable {

 public void run() {
  process1(); //первый трудозатратный процесс;
  progress.setProgress(10);

  process1(); //второй трудозатратный процесс;
  progress.setProgress(20);

  process1(); //третий трудозатратный процесс;
  progress.setProgress(30);
 }
}


Как итог, я вижу сразу значение 30, после того, как задача выполнится целиком.

Получается, что у меня все операции должны выполняться в потоке EDT, поэтому я не могу использовать другие потоки для этих операций или что-нибудь типа SwingWorker.

Проблема осложняется тем, что progress - не что иное, как инстанс класса унаследованного от Observable. То есть как только мы делаем   progress.setProgress(value) это приводит к нотификации Observer-а и в итоге прогресс бар перерисовывается.

Подскажите, кто сталкивался, пожалуйста!



Это сообщение отредактировал(а) CHEM_Eugene - 5.10.2011, 12:37
PM MAIL   Вверх
Connie
Дата 8.10.2011, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



http://download.oracle.com/javase/tutorial...s/progress.html


Это сообщение отредактировал(а) Connie - 8.10.2011, 22:22
PM MAIL WWW   Вверх
jk1
Дата 9.10.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Цитата

Получается, что у меня все операции должны выполняться в потоке EDT

С точностью до наоборот. Тяжелые операции надо выполнять в рабочем потоке, а вызов setProgress() делать на EDT. Вот хорошая статья, там как раз есть пример с публикацией частичных результатов операции.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
CHEM_Eugene
Дата 10.10.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

но они отрисовывают GUI


это было ключевой фразой.

Connie
jk1

это не в тему.

Именно рендеринг таблицы и занимает львиную долю времени.
PM MAIL   Вверх
Skipy
Дата 10.10.2011, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(CHEM_Eugene @ 10.10.2011,  09:40)
Connie
jk1

это не в тему.

Именно рендеринг таблицы и занимает львиную долю времени.

Ну, если Вы считаете, что это не в тему - ищите сами. Хотя именно тут и зарыта собака.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
jk1
Дата 10.10.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Цитата

Ну, если Вы считаете, что это не в тему - ищите сами. Хотя именно тут и зарыта собака. 


Похоже действительно не в тему. Насколько я понимаю автора, у него есть много legacy-кода, в котором тяжелые операции перемешаны с отрисовкой GUI.
Можно попытаться вызов progress.setProgress офомить вот так:
Код

SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
                progress.setProgress(10);
            }
        });

Тогда следующая часть задачи начнет выполняться после update'а progress bar


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
CHEM_Eugene
Дата 10.10.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил проблему следующим образом:

Вместо того, чтобы выполнять всю исходную Task через SwingUtilities.invokeLater, я выполняю ее в другом клиентском потоке. При этом в самой таске затратные операции по отрисовке выполняются в EDT, а между ними отрабатывает перерисовка progress bar
PM MAIL   Вверх
Skipy
Дата 10.10.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jk1 @ 10.10.2011,  11:12)
Похоже действительно не в тему.

В тему. 

invokeLater ставит выполнение переданного Runnable в очередь EDT. Туда же попадает и событие по перерисовке progress bar-а. И пока не выполнится весь Runnable - как одно событие! - отрисовка прогресса не произойдет.

А когда ТС вынес всю работу в другой поток, а отрисовку оставил только эпизодическую - тогда и появилась техническая возможность вклинить между отрисовками компоненты перерисовку прогресса.

BTW, а отрисовку на offscreen image можно вообще всю в другом потоке делать. А потом в EDT одним движением отрисовать компоненту.

Это сообщение отредактировал(а) Skipy - 10.10.2011, 15:52


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0740 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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