![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| 604 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 15.4.2005 Репутация: 1 Всего: 1 |
Обьясните пожалуйста что такое SwingUtilities.invokeLater() как его использовать и для чего это нужно?
|
|||
|
||||
| batigoal |
|
||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Добавлено @ 14:41
Хотя вот мне это все ничего не объяснило. Подождем кого-нибудь умного... Добавлено @ 14:43 Видимо, запускает код немедленно, не дожидаясь, пока отработает код обработки событий, находящихся в очереди. Пример, когда это может понадобиться, придумать не могу. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||
|
|||||
| 604 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 15.4.2005 Репутация: 1 Всего: 1 |
У меня выдает: Hello World on Thread[AWT-EventQueue-0,6,main] This might well be displayed before the other message. А должно быть наоборот? Это сообщение отредактировал(а) 604 - 27.4.2005, 14:51 |
|||
|
||||
| batigoal |
|
||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Посмотри, какой странный результат я получил при выполнении такого кода:
Результат привожу полностью:
ох уж мне эта многопоточность... -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||
|
|||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Это в принципе идея того же треда, но более изощренная. В общем виде - твой обработчик будет поставлен в очередь событий для AWT и будет обработан уже после очередных задач.
В твоем случае событий там само собой нет, поэтому выполняем практически сразу. |
|||
|
||||
| batigoal |
|
||||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Если заменить
на обычный
то получим
Логично. Но применения этой возможности я вске равно не вижу. Разве что, как там написано, изменение GUI. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||||
|
|||||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Именно для этого и используется. Например ты хочешь изменить какие-то картинки на форме, но делать это прямо в обработчике например для кнопки - дело не очень мудрое. Графика и так в отдельном треде - потому результат может быть совсем странный. А так ты уверен, что твои изменения будут вызваны в нужное время. И самое главное это не завесит обработчик - ты из invokeLater выходишь сразу. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Спасибо. Теперь нам с 604 все понятно.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Lamer George
УУпс пока еще не совсем понятно Можно еще пример, совсем на пальцах если незатруднит, или от вас AntonSaburov |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Ну если на пальцах, то так:
Помимо основного потока программы (понятие потока расшифровывать не надо?), в ней существуют еще некоторые, "неявные" потоки, в частности, поток-диспетчер событий. Назначение его состоит в том, чтобы обрабатывать события интерфейса. Если мы будем клацать по интерфейсу слишком быстро (1000 кликов по кнопке в секунду Теперь допустим, что у нас есть ситуация, когда нам необходимо перестроить интерфейс во время выполнения программы. Тогда это лучше сделать не немедленно, а тогда, когда мы обработаем всю скопившуюся у нас на входе очередь событий. Тогда мы используем invokeLater() и наш поток выполнится лишь тогда, когда очередь очистится (пример 1). -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 1 Всего: 144 |
Объясняю. Так уж устроен AWT, что все оконные события выстраиваются в одну очередь и обрабатываются по порядку. Пока событие полностью не обработано, никаких видимых результатов на экране не будет. В большинстве случаев обработка тривиальная, все происходит быстро и никаких тормозов не заметно. Но иногда нажатие кнопки или еще какое-нибудь пользовательское действие запускает операцию, которая занимает ощутимое время: типа мощное вычисление, установка соединения или чтение/запись большого файла. Допустим, это длится одну минуту. Если ничего специально не предпринимать, юзер будет целую минуту тупо сидеть перед застывшим экраном и вообще не иметь ни малейшего понятия, что происходит. При этом вы в коде обработчика можете ему там выводить всякие надписи, показывать индикатор прогресса и т. д. - все псу под хвост, потому как отобразится это дело только когда вы вернете управление потоку, а это произойдет не раньше, чем ваша долгая операция так или иначе завершится. Выход тут в том, чтобы создавать для таких долгих штук отдельный поток и там их выполнять, а управление главному потоку обработки событий возвращать немедленно. Теперь вроде все нормально, но вы хотите, допустим, по мере продвижения операции выводить сообщения о прогрессе. Так вот, если это делать напрямую, типа там JTextArea.append("Еще один демульгатор был эксторнизирован\n"), то это чревато неприятностями, потому как многие классы в AWT/Swing не являются thread-safe (ну если вам так уж не нравятся оригинальные английские термины, пускай будут потокобезопасными Чтобы обновления такого рода были потокобезопасными, рекомендуется делать их потокобезопасным образом: заворачивать в объект типа Runnabe и подсовавать диспетчеру событий через посредство SwingUtilities.invokeLater(). Тогда, если в данный момент никакие кнопочки не нажимаются и ничего не происходит, обновление сразу и перерисуется, а если что-то уже обрабатывается, ваш запрос на обновление будет поставлен в очередь и получит возможность выполниться, когда до него дойдет очередь. Вот зачем, собственно, нужен invokeLater(). -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Не всем, только мне. Спасибо. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| 604 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 15.4.2005 Репутация: 1 Всего: 1 |
Всем спасибо! Написали очень понятно! Прошу прошения, но снова понял не до конца
Написал небольную программку, и не могу понять в чем тут проблема если я не использую этот invokeLater, и где конкретно в этом случае надо применять invokeLater?
Вроде понимаю что такое очередь и что что такое поток, но вот где применять и для какого случая этот invokeLater не понимаю |
|||
|
||||
| Stampede |
|
||||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 1 Всего: 144 |
Код не проверял, но выглядит вполне работающим. Проблема может быть в следующем. Вот у тебя по нажатию кнопки идет инкремент числа, которое отображается в JLabel. Поскольку ширина графического представления чисел разная, у тебя при изменении текста лэйбла будет каждый раз происходить перераскладывание компонентов в соответствии с политикой LayoutManager'а. Если при этом ничего другого на экране не происходит, то ничего страшного. Но что если ты в этот же момент захотел потянуть какой-нибудь сплиттер? Тут и могут произойти нежелательные казусы в виде висячих фрагментов элементов интерфейса (George, ничего, что я говорю по английски? Ну и вот, а если ты хочешь этого избежать, то ты делаешь вот так:
Тут надо понимать, что тот Runnable, который подсовывается диспетчеру событий, не имет никакого отношения к потоковости. Это просто удобный обобщенный способ вызова некой обезличенной беспараметерной функциональности. Поэтому у тебя будет один run() для твоего потока, где происходят всякие интересные штуки, а другой - для диспетчера, чтобы он знал, как инициировать действия по перерисовке. И произойдет это теперь уже синхронным, а не асинхронным образом. Так понятнее? -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
||||
|
|||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 1 Всего: 12 |
Спасибо Stampede, хорошо объясняешь, но я как и Lamer George
не люблю буржйских слов в русском, язык должен быть по возможности - чистым и не важно какой, а смешивать - это не красиво.. -------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| 604 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 15.4.2005 Репутация: 1 Всего: 1 |
Stampede
Короче говоря, если я правильно понял |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
604
Да. Stampede Как раз сейчас - без претензий -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| 604 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 15.4.2005 Репутация: 1 Всего: 1 |
Урра! Всем спасибо что научили!
|
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 1 Всего: 144 |
Вспомнил еще один анекдот: - Зачем использовать буржуйское слово фаерволл, когда есть хорошее русское слово - брандмауэр |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 1 Всего: 12 |
-------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Модератор: Уже флуд начался - не увлекайтесь.
|
|||
|
||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 3 Всего: 13 |
Запоздало, но все же. Вот когда начнут происходить странные вещи с перерисовкой, поведением менюшек (например после вызова диалога из обработчика менюшки) и прочие, вот тогда начинайте вспоминать про invokeLater(). Кстати, многие простые вещи типа label.setText() все-таки thread-safe. Metal_Heart, Вставил я как-то свой ПЗКП в ПКДПЗУ, закатал туда фильм... Технология!.. Я к тому что ты знаешь где границы в употреблении английских слов, сокращений в русском? (давайте, люди, аббревиатуру API переведем на русский и будем употреблять её) А в сообщениях на форуме? Здесь люди пишут не за деньги. Не говорите им как писать и они не скажут вам, куда пойти. Модератор, и все кого обидел - сорри за этот выпад. Накипело. |
|||
|
||||
![]()
|
| Правила форума "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. |