![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
SySaD |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.10.2007 Репутация: 1 Всего: 1 |
Доброго дня.
Возникла интересная проблема которую пока не знаю как решить. Вкратце: в проекте несколько модулей есть объект, описывающий состояние системы, далее - процесс-менеджер, имеющий public функцию processGUIaction(int ActionCode), которая в зависимости от параметра анализирует состояние системы, готовит/изменяет данные и вызывает функцию перерисовки GUI - GUI, имеющий открытую функцию drawPageOnSs(), которая анализирует состояние системы, формирует нужное окошко и отображает его - посредник между процесс-менеджером и GUI, передающий обращения одного к другому определенные события в GUI вызывают обращения к процесс-менеджеру обновлением данных в GUI занимается эта функция, упрощенно выглядящая как показано ниже
все работает нормально далее в 3 местах проходит большая работа по выборке данных из базы и подготовке их для вывода на экран. занимает от 5 до 30 секунд. на эти время надо вывести на экран поверх основного фрейма gif с часиками ![]() я набросал навскидку класс:
и попробовал его запускать в отдельную нить, для того чтобы он был поверх всех окон но не блокировал выполнение программы. И тут возникла ситуация, что диалог рисуется, но без элементов внутри, просто серый прямоугольничек. Если я вызываю тупо, например:
то все хорошо - анимэшка играет, все рисует, но останавливается вся программа пока не закрою окошко. Может у кого есть идеи. Понимаю что скорее всего это нехватка знаний. Но жду идей. спасибо всем |
||||||
|
|||||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
Попробуйте запускать TimeDialog в новом потоке.
|
|||
|
||||
SySaD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.10.2007 Репутация: 1 Всего: 1 |
в GUI через посредник вызываю такую функцию для примера
public void showProgress() { final Logger logger = Logger.getLogger("storm"); logger.debug("show begin"); final TimeDilog dlg = new TimeDilog(); dlg.pack(); Thread t = new Thread() { public void run() { dlg.setVisible(true); } }; t.start(); } и повесил вызов напрямую на одну из кнопок получились результаты 1) прямой вызов с кнопки: ![]() 2) вызов через showProgress ![]() если использую invokeLater то отрисовывается но уже после подготовки данных (в процесс-менеджере на кнопку "выбрать" срабатывает 1) вызов showProgress 2) подготовка данных 3) hideProgress 4) вызов drawPageOnSs ) |
|||
|
||||
SySaD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.10.2007 Репутация: 1 Всего: 1 |
В догонку: диаог с часами отрисовывается после того как отрабатывает drawPageOnSs. видимо это связано с очередью событий, но решения все равно не знаю. invoke тут видимо ни при чем...
|
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
Это все вынесите в отдельный поток. Обработчик, повешенный на кнопку, должен только создать рабочий поток, который всеми перечисленными действиями займется. Если он будет выполнять длительное действие, то UI подвиснет, поскольку выполнение идет в потоке обработки событий. |
|||
|
||||
SySaD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.10.2007 Репутация: 1 Всего: 1 |
да обработка и так висит в отдельном потоке
GUI не подвисает а ждет пока процесс-менеджер подготовит данные для отображения и вызовет drawPageOnSs обработка кнопок вообще минимальна: например на кнопку "выбрать"
ключевое здесь это proccessGUIAction(Constants.ACTION_SELECT_SURVEY); через класс-посредник вызывается процесс-менеджер, который обрабатывает нужные данные мне интересно почему не отриовывается TimeDialog или отрисовывается после выполнения drawPageOnSs если нужен код - то только в личку |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
Посмотрите вот на этот пример:
Это сообщение отредактировал(а) powerOn - 24.4.2008, 17:21 |
|||
|
||||
SySaD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 30.10.2007 Репутация: 1 Всего: 1 |
Да, пример понятен, спасибо.
к сожалению у нас немного другая система и пишет ее целая группа программистов,я отвечаю лишь за GUI. Написал простенький пример, по которому можно понять логику работы текущего варианта проекта и увидеть проблему которую я описывал. Присоединённый файл ( Кол-во скачиваний: 6 ) ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |