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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EDT поток 
V
    Опции темы
Grizli
Дата 15.4.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня есть тяжеловесная работа по коннекту, закачке данных. Как мне  отследить, чтобы весь GUI работал только в EDT (Event Dispatch Thread) потоке, а рабочие потоки не совались со своей работой в  него. 


Это сообщение отредактировал(а) Grizli - 15.4.2012, 13:34
PM MAIL   Вверх
COVD
Дата 15.4.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



PM MAIL   Вверх
Avaj
Дата 15.4.2012, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

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



SwingWorker поможет?
PM MAIL   Вверх
Grizli
Дата 15.4.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ошибка
Код

[19:08:25] [SEVERE]    Exception in thread "main" 
[19:08:25] [SEVERE]    java.lang.IllegalAccessError: tried to access method org.spoutcraft.launcher.gui.LoginForm.<init>()V from class org.spoutcraft.launcher.Main
[19:08:25] [SEVERE]        at org.spoutcraft.launcher.Main.main(Main.java:149)



Код  в классе Main
Код

                LoginForm login = new LoginForm();
                login.setVisible(true);

PM MAIL   Вверх
Mirkes
Дата 15.4.2012, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Grizli @ 15.4.2012,  16:14)
Код  в классе Main
Код

                LoginForm login = new LoginForm();
                login.setVisible(true);

Насколько я помню, main выполняется не в EDT. Поэтому правильным будет код
Код

        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
                LoginForm login = new LoginForm();
                login.setVisible(true);
          }
        });



--------------------
Mirkes
PM MAIL   Вверх
Skipy
Дата 26.4.2012, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mirkes @ 15.4.2012,  17:05)
Цитата(Grizli @ 15.4.2012,  16:14)
Код  в классе Main
Код

                LoginForm login = new LoginForm();
                login.setVisible(true);

Насколько я помню, main выполняется не в EDT. Поэтому правильным будет код
Код

        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
                LoginForm login = new LoginForm();
                login.setVisible(true);
          }
        });

Согласно руководству Sun setVisible можно вызывать напрямую из main:

http://java.sun.com/products/jfc/tsc/artic...s/threads1.html

А упомянутый IllegalAccessError не имеет отношения к потокам: http://docs.oracle.com/javase/6/docs/api/j...ccessError.html

Цитата
Thrown if an application attempts to access or modify a field, or to call a method that it does not have access to. 

 Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.


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


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


Бывалый
*


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

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



Цитата(Skipy @ 26.4.2012,  09:31)
Согласно руководству Sun setVisible можно вызывать напрямую из main:

http://java.sun.com/products/jfc/tsc/artic...s/threads1.html

Skipy, а как же http://docs.oracle.com/javase/tutorial/uis...cy/initial.html

Edit: Там создается GUI и вызывается метод setVisible не из main. Где правда  smile ?

Это сообщение отредактировал(а) mstalker26 - 26.4.2012, 13:56
--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
Mirkes
Дата 26.4.2012, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Grizli @  15.4.2012,  13:08 Найти цитируемый пост)
У меня есть тяжеловесная работа по коннекту, закачке данных. Как мне  отследить, чтобы весь GUI работал только в EDT (Event Dispatch Thread) потоке, а рабочие потоки не совались со своей работой в  него. 


Цитата(Mirkes @  15.4.2012,  17:05 Найти цитируемый пост)
Насколько я помню, main выполняется не в EDT. Поэтому правильным будет код


Цитата(Skipy @  26.4.2012,  10:31 Найти цитируемый пост)
Согласно руководству Sun setVisible можно вызывать напрямую из main:


Автор ХОТЕЛ что бы весь GUI работал из EDT. А main вызывается не из EDT. Ровно это я и имел в виду.


--------------------
Mirkes
PM MAIL   Вверх
Skipy
Дата 27.4.2012, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mstalker26 @ 26.4.2012,  13:54)
Skipy, а как же http://docs.oracle.com/javase/tutorial/uis...cy/initial.html

Edit: Там создается GUI и вызывается метод setVisible не из main. Где правда  smile ?

Тут дело в чем... Видимые проблемы происходят из-за того, что нет нормальной синхронизации между EDT и фоновыми потоками. Если мы будем использовать invokeLаter или invokeWait - проблем не будет гарантированно. Если мы вызовем setVisible из главного потока и это будет последней инструкцией в этом потоке - проблем не будет с очень высокой долей вероятности. 

Это все равно что поднимать машину на подъемнике. Можно просто поднять, если подъемник не сломается, то проблем не будет. А можно поднять, подложить бетонные блоки и опустить машину на них, тогда проблем не будет гарантированно. 

Какой способ использовать - каждый решает сам. У меня за более чем 16 лет разработки на Java не было проблем из-за того, что я setVisible вызывал из основного потока. В глубине setVisible всего лишь показывает native-окно ОС и посылает ему асинхронное событие перерисовки, которое точно выполнится в EDT.


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


Бывалый
*


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

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



Я тогда подстрахуюсь бетонными блоками smile
Спасибо за ответ, Skipy, как всегда кратко и по делу.
--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0812 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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