![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
_Y_ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Знаю что тема старая-затасканная, не бейте. В очередной раз столкнулся с блокировкой GUI при выполнении сложных рассчетов, хотя рассчеты выполняются в отдельном потоке. Стал искать ошибку. Не нашел пока. Но зато натолкнулся на такой странный феномен. Это два простых тест класса. Первый это GUI. Он просто показывает ничем друго другу не обязанные JLabel и JButton. JButton считает сколько раз на него нажали (ну надо же ему что-то делать):
Второй класс иммитирует тяжелые рассчеты, посылая при этом их результаты в JLabel и на консоль:
Работа второго класса очень ощутимо подвешивает GUI, хотя и не завешивает полностью. Если же закомментировать во втором классе строку №41 System.out.println("" + sum); то ничего больше не подвисает. Ну очень интересно чем это обусловлено. Это сообщение отредактировал(а) _Y_ - 16.11.2008, 19:45 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||
|
|||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
Так вы же сами загружаете EDT вот это операцией:
Это сообщение отредактировал(а) powerOn - 16.11.2008, 21:31 |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Был бы очень благодарен за подробности. Что при этом конфликтует и почему? А как быть? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Vurn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 24.5.2007 Репутация: нет Всего: 3 |
На каждый оператор, в том числе и System.out.println(), требуется свое время на выполнение, большое или маленькое. println() работает достаточно медленно по сути, и придерживает поток в итоге. Избавиться от задержек можно накапливая результат в StringBuffer, вываливая на экран содержимое этого буффера из другого потока время от времени.
|
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Vurn, в том-то и дело, что этот оператор не тормозит программу, а именно подвешивает GUI. При этом на консоль ничего не выводится, просто GUI висит довольно продолжительное время.
За решение спасибо, но вопрос не как решить задачу (она-то как раз простая, но и никому не нужная). Вопрос почему подвисает GUI, что конфликтует, в чем ошибка? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 4 Всего: 81 |
Это то как раз понятно, метод run() (строки 39-42) выполняется Event Dispatch Thread'ом, и если он будет выполняться относительно долго то GUI будет тормозить. Непонятно почему System.out.println() тормозит. У меня (JVM 1.6.0_07 Sun, win32, XP SP2) - разницы не вижу. Вытащите System.out.println(sum); из под SwingUtilities.invokeLater(...); да и всё. И кстати busyThread.start() наверно, а не run(); ? |
|||
|
||||
Vurn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 24.5.2007 Репутация: нет Всего: 3 |
Я бы рекомендовал, по сути, никогда не использовать System.out.println() внутри циклов. Вместо этого накапливал бы логи в StringBuffer/StringBuilder и при нужных условиях писал их куда мне надо.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |