![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| zeynor |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.11.2011 Репутация: нет Всего: нет |
Здравствуйте!
С потоками только начал обращаться из-за острой необходимости, и вот не получается разобраться с некоторыми моментами. Суть в следующем: по нажатию кнопки из главного окна программы (вся графика на SWT) должно открываться диалоговое окно и запускаться новый поток, вызывающий определенные методы. В окне отображается информация о том, что происходит на данный момент в потоке. Как пытаюсь сделать я: Нажатие кнопки:
Класс MyThread:
Класс MyDialog:
Проблема в том, что не обновляется переменная "go", поток не завершает работу после закрытия диалога. Пробовал делать по-другому: сначала запуск диалога, из него запуск потока, но та же проблема. Единственное решение, которое у меня работало - как описано строчкой выше, но в классе MySListener принудительно закрываю поток (thread.stop()). Насколько понял, этот вариант считается ненадежным и устаревшим. Как можно выйти из этой ситуации? Спасибо |
||||||
|
|||||||
| Skynin |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 6 Всего: 10 |
Нехорошо! Зачем в Runnable запихивать создание элемента GUI? когда все равно syncExec запустит этот Runnable в потоке GUI? "Толкем воду в ступе" или "масло масляным делаем"?
Вот пусть и: 1. Открывается окно 2. Запускаем поток в котором ничего нет из GUI элементов, кроме 2а. передаем ссылку нашего окна, и когда нужно ему что-то передать:
3. Когда окно закрывается, убиваем поток. Либо флагом (внутри должен обрабатываться) либо interrupt() ему |
||||||
|
|||||||
| zeynor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.11.2011 Репутация: нет Всего: нет |
Спасибо за ответ!
Насколько понял, ссылку окна передаем в новый поток, и только по ссылке управляем поведением элементов в окне? Т.е. если допустим у нас данные в потоке получаются в цикле, то будет выглядеть примерно так:
Или как-то по-другому? И вопрос по поводу флага немного не понял, если у нас поступает информация о состоянии окна из самого окна (при закрытии к примеру), как передавать изменившийся флаг внутрь потока? interrupt попробую... Буду благодарен за объяснения. Спасибо! |
|||
|
||||
| firedrago |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 2 Всего: 3 |
все зависит от конкретной задачи, и в идеале делать логику отдельно от GUI как сказал Skynin, но если для теста и на быструю руку то можно как в примере http://git.eclipse.org/c/platform/eclipse....s/Snippet7.java
пока элемент или диалог !isDisposed() делай, иначе выходи |
|||
|
||||
| zeynor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.11.2011 Репутация: нет Всего: нет |
Пока сделал таким образом:
1) Из главного окна запускаю диалоговое окно 2) Из диалогового окна запускаю поток (туда передаю ссылку на нужные данные и текущее диалоговое окно) и добавляю слушатель для обработки выхода из окна, куда вешаю interrupt:
3) В самом потоке делаю операции с нужными данными и изменяю информацию в диалоговом окне 4) Для каждой итерации получения данных в потоке проверяю условие isInterrupted, если false - продолжаю работу. Что можете сказать по такому решению? Меня пока не устраивает, т.к. у меня данные получаются из сети, данные многоуровневые, много итераций. И для каждого вхождения в каждый метод (и внутри него) требуется ставить проверку условия isInterrupted. Может есть какой-то более изящный способ? |
|||
|
||||
| firedrago |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 2 Всего: 3 |
Вы используете чистый SWT или Eclipse RCP ? В RCP есть прекрасная штука под нозванием Job или UIJob. А если чистый SWT, то на мой взгляд, лучше проверять существование Dialoga чем Threada.... а то если по какой то причине вывалится получение данных, то пользователь будет сидеть и тупо смотреть на Dialog с текстом "Please wait...."
... хотя проверять надо и то и то.... Это сообщение отредактировал(а) firedrago - 9.11.2011, 11:03 |
|||
|
||||
| zeynor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.11.2011 Репутация: нет Всего: нет |
firedrago,
Чистый SWT. Пока сделал так, как написал, и все практически прекрасно работает. Проверка isDisposed не нужна, т.к. я передаю потоку interrupt по действию закрытия окна. Единственный минус - пока что флаги поставил не во все существенные места, и в определенных случаях вываливается ошибка Widget not disposed. Но это уже не проблема, т.к. такую же ошибку для других ситуаций решил. Спасибо всем, кто помог! |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |