powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение gui из другого потока
79 сообщений из 79, показаны все 4 страниц
Чтение gui из другого потока
    #38739128
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
В Jave новичок, поэтому вопрос начального уровня.
Использую eclipse.
В программе два потока- один отвечает за пользовательский интерфейс (кнопки, текстовые элементы и пр., созданные в swt) и создает второй поток, который выполняет определенную обработку (дергает данные из базы MS Sql Server и куда-то их заносит). Запрос к базе (условие в where) зависит от штрих-кода, который считывается в текстовый элемент в главном окошке программы.
Собственно вопрос, как правильно из второго потока считать данные из gui элемента основного потока?
Когда речь идет об обновлении такого рода элементов на помощь приходят статьи типа
http://wiki.eclipse.org/FAQ_Why_do_I_get_an_invalid_thread_access_exception?
и методика Display.syncExec/Display.asyncExec.
А вот что касается чтения данных из гуи, я так и не нашел пока ответа на свой вопрос.
Укажите направление, пожалуйста.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739253
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
зачем делать второй поток, если where, и наверняка, результаты используются из основного потока?
По хорошему, нужен один поток на ГУИ и БД.
Либо костыль в виде - делаем из двух потоков - один обратно.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739280
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 ,
Ага, и получите вы классику жанра: юзер плыкает на кнопку, визуально она "не отжимается обратно", все виснет, и только когда СУБД отдает ответ, оживает обратно. Работать с такими приложениями ужасно неприятно.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739291
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvвсе виснет
сразу видно:
1) ты не работал на таких приложениях
2) чем ты решил заниматься пока ждёшь 1 сек
3) что у тебя за БД которая не отвечает 10-60 сек?
4) стандарт десктопа - post в БД при переходе курсора на след строку в таблице заказов....в том-же потоке.
PS
Java мало пишет клиент-сервер (ГУИ), а больше бекенд - серверную логику.
Поэтому тут несколько искажённое представление о толстых клиентах.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739311
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда подробнее о самой задаче.
Итак, допустим, в УФМС используется софтина, которая автоматически формирует заявление на выдачу загран паспорта.
Человек пришел, данные забили, заявление напечатали.
Но это только первый этап.
Дальше эти данные должны попастьь в так называемое ППО "Территория"
http://umms.reksoft.ru/

Как быть? заставлять работников повторно забить те же самые данные еще и в веб формы?
Как временное решение (до принятия регламента электронного обмена) используется прога, которая
берет данные из базы и сама заполняет поля этой веб-морды.
Ну и отсюда вытекает специфика задачи, в частности ответ на вопрос, что за база, которая не отвечает по 10-60 секунд.
Это элементарно возможно- клик на кнопке приводит к поиску по базе на веб сервере и страница грузится неопределенное время.
Так что один поток, вроде бы, приведет к проблеме, озвученной во втором ответе топика.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739314
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и еще одно- почему Java.
"Территория" работает в браузере Google Chrome, автоматизация которого выполняется при помощи
Selenium Web Driver http://www.seleniumhq.org/ . Как видим там небольшой выбор используемых для работы с драйвером языков программирования. С# я не знаю абсолютно. Поэтому выбрал Javy
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739318
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
мож я чего не понял..
- веб проект или толстый клиент?....я увидел swt......
А пользователя конечно ничего не надо заставлять).
До техрегламента перебрасывать данные из БД_А в вашу БД_Б по временному соглашению ...БЕЗ ГУИ.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739320
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
в общем виде, перед стартом потока - собрать и дать ему все данные для работы. Чтобы потом не тормозить его.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739321
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КнопкаСтарт_onClick{
- штрихКод = editКод.text
- ФИО = editФИО.text
- StartServis(v1, v2, .....)

потом запускай этот StartServis хоть из основного в этой же кнопке, хоть в потоке.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739323
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы так сделал.
- в проге 2 модуля - ЗапросУФМС и СтартППО
- В проге юзверь в основном потоке запрашивает УФМС и читает только чтение что там есть + получает токен доступа в УФМС.
- при согласии нажимает ВАШУ кнопку СтартППО и туда идёт токен.
далее вся обработка на вашем сервере. Ничего через клиента кроме токена не пересылается.
Где тут потоки?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739368
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
спасибо за внимание к проблеме, но теперь уже я мало что понял.
Возможно, придется еще детальнее описать задачу.

Значится так. Допустим, человек пришел за загранпаспортом. Он должен написать заявление. Он может это сделать самостоятельно, и эта ситуация не имеет никакого отношения к описываемой проблеме. Либо же он может воспользоваться платной услугой в том же УФМС, где ему сами напечатают заявление. Допустим есть прога А, которая заносит данные в базу MS Sql Server (в твоей терминологии наша база) и печатает это заявление. Но дальше информация из заявления должна попасть в ППО "Территория" (ссылку я уже приводил). Иного доступа к этой базе, кроме как через веб-интерфейс нет. Поэтому единственный способ, хоть как-то облегчить работу пользователям, это эмулировать ручной набор полей на форме сайта при помощи автоматизации браузера.

Теперь о некоторых технических деталях.
1) Полностью автоматизировать ввод невозможно в принципе.
1.1) прежде чем добавить нового заявителя нужно убедиться, что его еще нет в базе, для чего сначала осуществляется поиск по документу, если не найден, то поиск по ФИО и только если и тут не найден появляется кнопка Добавить. Поиск по ФИО, возможно, вернет несколько возможных вариантов и только пользователь должен решить, выбрать ли один из них, либо-таки добавить нового.
1.2) ряд справочников совершенно не согласован со справочниками программы А. выбор из справочников представляет собой выбор из autocompleted field. Например, для поля "место регистрации, город" все, что можно сделать это забить в поле название города, после чего раскроется список выбора (и как правило он будет состоять не из одного элемента) и ожидать, когда пользователь сделает этот выбор.

Отсюда следует простой вывод- нужно уметь останавливать процесс заполнения данных, и возобновлять его по команде.
В случае двух потоков решение я вижу примерно таким:
поток 2:
.....
дошли до места, где надо встать
synchronized(monitor) {
monitor.wait();
ждем, пока пользователь не выполнит ручное редактирование и не жмакнет на кнопку Продолжить
}

Главный поток (в гуи по клику на кнопку Продолжить)
synchronized(monitor) {
monitor.notify();
}

Буду признателен, если ты подскажешь, как реализовать желаемое поведение в однопоточном приложении.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739386
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnickИтак, допустим, в УФМС используется софтина, которая автоматически формирует заявление на выдачу загран паспорта.
Человек пришел, данные забили, заявление напечатали.
Но это только первый этап.
Дальше эти данные должны попастьь в так называемое ППО "Территория"
http://umms.reksoft.ru/

Как быть? заставлять работников повторно забить те же самые данные еще и в веб формы?Заставлять работников сразу вбить данные в веб-формы ППО "Территория" и только после этого заносить результат в "свою" базу.
Ну или требовать доступ в рамках того же СМЭВ или аналога.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739408
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
а как соотносится эта ППО Территория и ГОСуслуги, через которую я получал загранпаспорт.
Было быстро и удобно, не выходя из дома))
Почитал отзывы про ПО - есть над чем работать
тупые java-апплеты грузятся по несколько секунд, печать листочков прибытия/убытия - это вообще отдельный разговор, а их вид и отсутствие возможности нормального редактирования (долбанный rtf формат)

Если взять за образец - ГОСуслуги, то не хватает только согласовать ТЗ?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739429
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
соотносится самым тесным образом- скорее всего это одна и та же база данных.
Но заявления с портала госуслуг обрабатываются в порядке общей очереди.

В моем случае все наоборот.

Но мне все-таки хотелось бы вернуться к вопросу о чтении информации из визуальных элементов в дочернем потоке :-)
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739440
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnickНо мне все-таки хотелось бы вернуться к вопросу о чтении информации из визуальных элементов в дочернем потоке :-)
ОК. Я в политику не лезу). Давай без неё.
...
Только давай конкретнее - в цифрах.
- мой POST с записью в БД на AutoPOI длится 470миллисекунд.
- сколько у тебя идут запросы, учитывая 2 факта:
-- есть Гугл, который выдаёт поиск на ввод каждого символа
-- запросы нужно разбить на мелкие после каждого контрола, а не загружать стрницу.
ЗЫ. я не понял взаимодействие 3-х лиц: Ваш сиквел ---ППО --УФМС (это к вопросу Basil A. Sidorov без твоего ответа)
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739444
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда и я не понял, при чем тут это все (в т.ч. оставленный мной без ответа пост Basil A. Sidorov)
Пойми, все, что я делаю, это программно имитирую пользовательский ввод на странице в хроме.
выглядит это так. Пользователь щелкает сканером по штрих-коду, после чего нажимает кнопку Обработать и дальше "смотрит видео" где автоматически происходит заполнение полей на странице. Но периодически ему нужно вмешиваться в процесс, например делать выбор из справочника и снова запускать автозаполнение. Когда заполнение формы завершится, он все проверит и сам жмакнет по кнопке в браузере Сохранить. И может сканировать следующий штрих-код.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739458
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
я не могу понять, где твой \ ваш код. И вы можете писать его "правильно".
А где не ваш, и вы не можете на него повлиять. Напр. долгий ответ от БД в веб......
.......
Если полностью весь код в хроме (JS) твой, а веб сервис тормозит не по вашей причине.
То:
вар1 (как андроиде) - старт мелких потоков после выхода из фокуса. Результат потоков напр. по AJAX асинхронно проверяется не в вашей БД и заносится рядом контролом зелёным флажком. Как в Eclipse.
Основной поток провярет эти флажки на кнопке "Далее".
Для веб JS AJAX уже есть. Для анроида-подобных есть класс
Код: java
1.
class XXXXXXXXXX extends AsyncTask


в котором есть методы для ГУИ основного потока.

Оно?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739463
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в том-то и дело, что весь код в хроме не наш и влиять на него мы не можем.
Но есть средство автоматизации selenium web driver. Вот с его помощью я могу обращаться к элементам веб страницы
т.е. писать что-то типа .....findElement(By.Id("Id элемента").setText и т.о. заполнять форму ввода в браузере.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739464
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnickПользователь щелкает сканером по штрих-коду, после чего нажимает кнопку Обработать и
дальше "смотрит видео" где автоматически происходит заполнение полей на странице.
до чего доходят наши программисты, при волоките согласования гос-органов((
imho
Было один раз - рисовал не в своём комоненте по hanle окна сверху.
Он (компонент ничего не знал и перерисовывал стирая меня при перекрытии окна)))))
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739465
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Можно же реализовать интерфейс Runnable а в конструктор получившегося класса передавать либо ссылку на компонент, либо значение компонента (аля штрих-код). Ну, и в методе run реализовывать запрос к БД, например...
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739469
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnickв том-то и дело, что весь код в хроме не наш и влиять на него мы не можем.
Но есть средство автоматизации selenium web driver. Вот с его помощью я могу обращаться к элементам веб страницы
т.е. писать что-то типа .....findElement(By.Id("Id элемента").setText и т.о. заполнять форму ввода в браузере.
теперь я хоть ТЗ понял)))).
Тут может кто подскажет. Такие хаки меня никогда не интересовали.
т.к. селениум не знаю - OFF
.........
а потоки тут каким боком?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739471
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychi,
да. Я про него выше и писал.
В андроиде по другому назван.
..
Ну, и аффтар хотел один поток, а я предложил на каждый контрол.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739478
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
значение в конструктор передавать не могу- оно будет меняться (я не хотел делать на каждый штрих-код отдельный поток).
А вот теперь поговорим поподробнее о передаче самого компонента в конструктор, т.к. именно так изначально и сдела

NewTread(..... ,Text edBarCode, )

Но теперь попытка считать из него данные в методе Run

без нагромождения этого
Код: java
1.
2.
3.
4.
5.
Display.getDefault().asyncExec(new Runnable() {
               public void run() {
                  Здесь вызвать edBarCode.getText();
               }
            });



приводит к ошибке Invalid thread access
А с нагромождением этого чуда, я не могу сохранить значение в локальной переменной.
Вот как-то так :)
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739494
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Я говорил об описании нового класса, который реализует (implements) интерфейс Runnable

Например,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class NewClass implements Runnable{
    //ссылка на текстовое поле
    private final JTextField textField;
    
    //инициализируем ссылку на текстовое поле
    NewClass(JTextField c){
        textField = c;
    }
    
    //переопределяем
    @Override
    public void run() {
        System.out.println(textField.getText());
    }
    
}



А после:

Код: java
1.
Display.getDefault().asyncExec(new NewClass(MyTextField)); //MyTextField - экземпляр тексового поля (JTextField)
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739498
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Как вариант, можно и в других местах собирать и хранить экземпляр класса (ибо я не вижу где и как это используется), реализующего Runnable, а в нужном месте просто использовать ссылку на него.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739508
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Есть вопрос по поводу
Код: java
1.
Display.getDefault().asyncExec



Насколько я могу судить по этому:

from stackoverflow Everything executed in (a)syncExec is using the display thread and therefore blocking your UI until it returns. I suggest you use Eclipse Jobs. This will use the progress indicator that the workbench already offers out of the box.

Все что исполняется ч/з (a)syncExec будет использовать поток дисплея(?) и поэтому будет блокировать пользовательский интерфейс. Как-то так.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739510
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а я отвечал о наследовании от Thread.
Есть ли разница в контексте рассматриваемого вопроса?


Код: java
1.
Display.getDefault().asyncExec(new NewClass(MyTextField));



А вот вызывать сам конструктор здесь мне даже в голову не приходило.
Спасибо за мысль, это надо обдумать.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739511
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi Все что исполняется ч/з (a)syncExec будет использовать поток дисплея(?) и поэтому будет блокировать пользовательский интерфейс. Как-то так.

Вот это-то как раз не является неожиданным. Это, как я понимаю, аналогично делфийскому Synchronized(UpdateCaption).
Не страшно, т.к. действия тут минимальны.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739512
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

В контексте вопроса - без понятия.

Знаю лишь, что, когда еще в универе начал изучать яву, сразу натолкнулся про совет реализовывать Runnable , а не расширять Thread . Опыта с многопоточностью пока толком не имел, ничего сказать не могу.

Контекста то же не шибко усматриваю.

Вообще, как могу полагать, здесь хватит анонимного экземпляра класса. Максимум, ссылка на экземпляр. А уж как вам этот поток запускать (ч/з (a)syncExec или ч/з new Thread(<экземпляр класса>) ) решать только вам.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739515
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

забыл, конечно же new Thread(...).start() ;
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739516
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторDisplay.getDefault().asyncExec(new NewClass(MyTextField));

Присмотревшись к этому коду я начинаю понимать, что метод run нового потока (т.е. все, что делает новый поток) будет перенесено в контекст основного потока. Как бы это не совсем то, чего хотелось бы :-)
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739518
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

А если использовать

Код: java
1.
new Thread(new NewClass(MyTextField)).start()

?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739521
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То тогда приходим к тому, с чего начали.
Ссылку на компонент передадим. Объект потока создадим.
При попытке реально считать текст из компонента без AsyncExec отхватим "invalid thread access".
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739522
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
в run только текст в ГУИ выкинуть. Вот болванка
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public class FileEditor extends JFrame{

    private JTextArea dataField;
    private String fileName;

    public FileEditor(String fileName){
        super();
        this.fileName = fileName;
        dataField = new JTextArea(40,20);

        // ... some other initialisation

        Thread dataLoader = new Thread(new FileLoader());
        dataLoader.start();
    }

    private class FileLoader implements Runnable{

        public void run(){
            final StringBuffer content = new StringBuffer();

            //... loading file data here into buffer

            if (SwingUtilities.isEventDispatchThread()){
                dataField.setText(content.toString());
            }else{
                SwingUtilities.invokeLater(new Runnable(){
                    public void run(){
                        dataField.setText(content.toString());
                    }
                });
            }
        }
    }
}
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739523
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Забавно все это.

У меня-то все что есть это JFrame.

В обработчике нажатия кнопки JButton
Код: java
1.
new Thread(new NewClass(Text)).start();



В NewClass run():
Код: java
1.
System.out.println(textField.getText());

- и все ок
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739526
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
так, этот вариант я вроде бы тоже обдумывал, но, допустим, теперь пользователь изменяет значение текстового поля и мне надо записать туда новое значение.
такое объявление переменной
Код: java
1.
final StringBuffer content


.....
позволит мне в дальнейшем повторно вызвать:
Код: java
1.
2.
3.
4.
5.
6.
SwingUtilities.invokeLater(new Runnable(){
                    public void run(){
                        dataField.setText(content.toString());
                    }
                });
            }


?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739529
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Давайте еще раз уточним.

Есть текстовое поле ввода. Есть БД.

Необходимо формировать и посылать запрос к БД на основе содержимого текстового поля.

Чтобы интерфейс пользователя не зависал на время выполнения запроса, необходимо запускать выборку в отдельном потоке.

Так?

Если так, то какие проблемы?

Описываем класс, который реализует Runnable, в конструктор передаем ссылки на нужные объекты интерфейса, в которые можно будет записать данные, которые вернет запрос к БД.

Про конструктор кстати и мог говорить Petro123

Petro123gnick,
в общем виде, перед стартом потока - собрать и дать ему все данные для работы. Чтобы потом не тормозить его.

И после этого использовать экземпляр данного класса как и было сказано раньше.
Ч/з тот же SwingUtilities.invokeLater(<экземпляр класса>);
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739538
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
нет, не так :-)

Чесно говоря, я больше не осилю объяснение причин, по которым мне нужен второй поток, выше по тексту я уже написал все, что могу сказать по этому поводу.

Код: java
1.
в общем виде, перед стартом потока - собрать и дать ему все данные для работы. Чтобы потом не тормозить его. 



Это будет означать, что мне надо на каждый новый штрих-код стартовать отдельный поток.
Может быть и стоит так поступить, но это будет означать существенное перепроектирование структуры программы.
Пока я хотел обойтись двумя потоками- один гуи- управляющий- обрабатывает сообщения операционной системы и юзера и управляет запуском остановкой второго потока обработки.

А проблема лишь в том, повторюсь в очередной раз, что второй поток должен считывать данные из компонентов гуи, созданных в главном потоке, и делать это регулярно, а потому не только и не столько в конструкторе объекта потока.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739539
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Опять же, если вы решили сделать заполнение полей ввода по шагам
Почему бы не описать класс следующим образом.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class NewClass implements Runnable{

    private final JTextField srcField, destField;
    
    NewClass(JTextField srcField, JTextField destField){
        this.srcField = srcField; //откуда взять значение (штрихкод)
        this.destField = destField; //куда вернуть значение
    }
    
    @Override
    public void run() {
        String code = srcField.getText();
        //запрос к базе
        //...
        //помещаем в переменную (например, String data) данных из базы
        String data;
        //...
        //производим нужные манипуляции, если необходимо
        //...
        //помещаем данные из переменной в текстовое поле
        destField.setText(data);
    }
    
}



В итоге: мы можем передавать в конструктор класса два экземпляра на поля ввода. То, которое содержит штрих-код и то, в которое нужно вывести данные результата запроса.

Например:

Код: java
1.
2.
3.
//есть поле ввода штрих-кода codeField и поле куда нужно вывести определенное значение из базы targetField
new Thread(new NewClass(codeField, targetField)).start();
//после выполнения в поле ввода targetField будет выведено нужное значение



Таким образом можно и изменять доступность элементов для заполнения. Другой вопрос - организовать метод, который будет вызываться при нажатии на кнопку, и который будет в зависимости от шага обрабатывать другие поля ввода.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739540
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychi,
+1
единственно мне непонятна событийная модель ....при его "окно на JS браузера нет доступа к коду".
Т.е. для старта запроса-потока при изменении текста нужно получить событие этого изменения.
TextEdit.onChange в Delphi ))
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739541
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Кажется, я что-то упустил. О каком именно втором потоке речь? Если хотите использовать один экземпляр класса реализующего Runnable, или реализующего Thread, то придется использовать класс, который является расширением Thread, в котором добавить метод обновления ссылки на поле ввода. И на новом шаге после обновления ссылки ч/з метод, например, MyThread.setTextField(..), снова запускать поток.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739543
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
к сожалению мы ходим по кругу.

Я снова вынужден повториться:
Код: java
1.
2.
3.
4.
5.
6.
7.
@Override
    public void run() {
        String code = srcField.getText();   [color=red]<--------------------- Вот здесь я получаю ошибку Invalid thread access[/color]
        //запрос к базе
        //...
        //помещаем в переменную (например, String data) данных из базы
        String data;
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739545
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

У вас в любом случае будет создавать каждый раз новый экземпляр класса потока. Но это же не говорит о том, что за единицу времени потоков будет больше два (если только вы не забудете отключать кнопку создающую поток, до завершения уже созданного потока)

P.S.: очень удивился, когда загуглил ваше мыло. Надеюсь, поставщики по госзакупкам не сильно наглеют.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739547
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Может действительно проще разобраться почему у человека бросается исключение?

Ведь мы одно и то же ему предложили)))
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739548
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnickМожет быть и стоит так поступить, но это будет означать существенное перепроектирование структуры программы.
веский довод - надо всё переписать.
автори делать это регулярно - регулярно делает работу Основной поток ГУИ.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739549
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Хорошо, фиг с ним с тексовым полем. Что не так со значением?

Почему вы считаете, что при нажатии на кнопку нельзя в поток передать значение, которое действительно на момент нажатия кнопки?

Ну, введен штирх-код.
При нажатии передаем в конструктор и запоминаем в поле класса это значение. В методе run формируем запрос и используем это значение.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739551
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychiPetro123,
Может действительно проще разобраться почему у человека бросается исключение?
Ведь мы одно и то же ему предложили)))
пусть выложит минимальный рабочий код.
Но я пас ))))). Не моя область JTextField ))
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739552
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
опять не врубился, увы.

Код: java
1.
2.
3.
единственно мне непонятна событийная модель ....при его "окно на JS браузера нет доступа к коду".
Т.е. для старта запроса-потока при изменении текста нужно получить событие этого изменения.
TextEdit.onChange в Delphi ))



Это зачем? Поток отрабатывает с одним штрих кодом и встает ( wait(), ожидая новый )
Пользователь сканирует новый штрих-код и нажимает Продолжить
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739553
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Да там от JTextField один только метод нужен, ну, максимум два.
Я просто не знаток потоков и не могу сказать, почему исключение кидается именно в том месте и тут, действительно, нужен код.
Нюансы хоть погуглить на основании чего-то будет.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739558
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

А зачем ему ожидать?
Зачем закручивать всю логику на одном потоке?
Пускай у вас поток будет выполнять только действия связанные с запросом, а состояние остальных компонент интерфейса меняйте по какому-нибудь счетчику шага что ли и в другом методе вообще.
Для вас поток должен быть как бы изоляцией от потока, в котором идет отрисовка и не более.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739559
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
Почему вы считаете, что при нажатии на кнопку нельзя в поток передать значение, которое действительно на момент нажатия кнопки?

Ну, введен штирх-код.
При нажатии передаем в конструктор и запоминаем в поле класса это значение. В методе run формируем запрос и используем это значение.



Напротив, я считаю, что так вполне можно сделать.

Одна проблема в том, что я уже довольно много накодил и у меня второй поток стартует сразу же практически с запуском программы. До собственно ввода данных он запускает экземпляр хрома, осуществляет вход на сайт (если, указан автологин в ини-файле) или же ждет залогинивания юзера, проверяет выбран ли нужный раздел сайта и только в этот момент начинает обрабатывать штрих-коды.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739561
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
а что там с моим мылом, не совсем понял?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739563
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,

Например,
Запускаете поток,
пока поток жив гоняете цикл - можете картинку загрузки в цикле обновлять
после цикла убираете картинку загрузки
после пишете проверку полученных из базы данных - достаете их, например, через какой-нить метод класса NewClass (для этого вам нужно и хранить экземпляр объекта)
после проверки идут действия с графическим интерфейсом
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739564
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gnick,
ну что делать. Тебе оба говорят - максимум работы - в потоке ГУИ.
Доп поток только оборачивать МЕДЛЕННЫЕ операции.
Напр. у меня в андроиде только пост запрос на копку Старт
Всё остальное успевает обработаться 1000 раз в основном потоке ГУИ
IMHO
Удачи!
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739565
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Если второй поток не отвечает за отрисовку интерфейса пользователя, то какие тогда проблемы?
Делаете в нем, что душе угодно, ибо это никак не отбразится на первом потоке, который отвечает за отрисовку и обработку событий пользовательского интерфейса. И не паритесь

Ваш адрес электронной почты указан в качестве адреса электронной почты организатора открытого аукциона, например.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739566
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychiВаш адрес электронной почты указан в качестве адреса электронной почты организатора открытого аукциона, например.Это, как бы, требование законодательства
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739567
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Ну, я как поставщик это все понимаю.
Просто удивился, что здесь увидел человека, тесно соприкасающегося с госзакупками
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739570
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
ну это давняя история. Когда-то я работал в организации, которая среди прочего была уполномоченным органом по размещению заказов для района.

Что касается потоков. Нельзя сказать, что обрабатывающий поток никак не влияет на пользовательский интерфейс.
Во-первых, в момент, когда он по какой-то причине останавливается, кнопочка Пауза меняется на Продолжить.
Кроме того, выводятся сообщения в аналоге делфийского статусбара.
И, наконец, с чего началась история, он должен считывать данные из гуи.
Я бы и хотел не париться, но приходится :-)
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739571
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Окей, тогда вопрос - что еще не работает, кроме вызова метода получения содержимого текстового поля?
Если все остальное работает, почему бы не обойтись передачей значения(обновлением какого-то поля объекта), а не ссылки на экземпляр объекта?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739573
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Off: я и не подозревал, что меня так много в гугле в связи с этими закупками
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739576
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Это называется - прозрачность))))
Хотя она напрямую от наглости заказчика зависит, к сожалению.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739579
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
обновление гуи работает как ожидалось.
А вот поведение считывания оказалось странным. поэтому я и завел песню. Вы и Petro123 утверждаете, что все должно быть нормально. И, поскольку это говорят два человека, это повод серьезно задуматься, не накосячил ли я в чем-то другом. Что я сейчас и делалю. А другое, над чем я сейчас крепко размышляю, опять-таки по Вашему совету штамповать дочерние потоки только для процедуры обработки конкретного штрих-кода. Так что большое Вам спасибо за обсуждение.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739580
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В любом случае, я уже не имею отношения к закупкам на стороне заказчика. Скорее теперь на противоположной стороне.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739583
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Вообщем, все что нарыл касается (a)syncExec

SWT: Respond to Long Running Tasks
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739584
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

По тексту увидите описание вашей проблемы.
Можете не париться, в общем, SWT однопоточен.
Там есть примеры.
Можете использовать то, что приведено и, конечно, свой класс(ы), в котором(ых) нужная логика будет реализована.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739589
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за внимание к проблеме и ценные советы.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739762
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Вы хоть сообщите потом о результате своей деятельности в отношении данной проблемы.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739846
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,
хорошо. Обратите все же внимание, что в указанной Вами статье, как собственно и в тех, которые нарыл в свое время я, упомянутая мной ошибка описывается в результате обновления данных гуи, а не попыток считывания оных. Поэтому иного способа сделать сколько-нибудь удачно, кроме передачи-таки самих значений в конструкторе, и, как следствие, создание отдельного потока на каждую новую обработку штрих-кода я по-прежнему не вижу. Видимо придется переделать все в этом направлении.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739853
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

На данный момент без кода и опыта, и опытов мне не разобраться. Пишут, что любое изменение из потока отличного от потока SWT UI будет бросать исключение.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739855
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

По вашим же словам получается наоборот - методы, которые вносят изменения - не возбуждают исключение, тогда как метод получения содержимого поля вызывает.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739865
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

from stackoverflowTo allow background threads to perform operations on objects belonging to the UI-thread, the methods syncExec(Runnable runnable) and asyncExec(Runnable runnable) of Display are used. These are the only methods in SWT that can be called from any thread. They allow a runnable to be executed by the UI-thread , either synchronously, causing the background thread to wait for the runnable to finish, or asynchronously allowing the background thread to continue execution without waiting for the result. A runnable that is executed using syncExec() most closely matches the equivalent direct call to the UI operation because a Java method call always waits for the result before proceeding, just like syncExec().

Как я понимаю, таким образом можно запускать код на выполнение в потоке UI, чтобы иметь возможность с ним(UI) работать.
Поэтому можно же делать следующие вещи из вашего второго потока.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class NewClass{
    private String code;
  
    void someMethod(){
        //код метода run будет выполнен в потоке SWT UI
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                //получаем штрих-код
                code = Text.getText();
            }
        });
        //делаем запрос в базу данных, который выполнится во втором потоке
    }
}



Если
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739897
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот теперь мы говорим на одном языке :-)

Дойдя до этого кода я и залез с вопросом на этот форум.
Код: java
1.
code = Text.getText();



Основной вопрос здесь такой- что тут есть переменная code? Где она объявлена и какова ее область видимости?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739900
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, был невнимателен к Вашему посту.
Я думал Вы только в следующем предложите выделить член класса.

В общем именно так у меня сейчас и реализовано. Но мне это не нравится. Эта переменная нужна очень ограниченный отрезок времени и необходимость резервирования для нее отдельного поля класса (а другого по-видимому просто нет) и наводит меня на мысль о том, что неверен сам подход.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739908
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Пока мне не приходит в голову другой метод получения из внутреннего класса данных.
Можно, конечно, так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        StringBuffer buffer= new StringBuffer();
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                //получаем штрих-код
                buffer.append(Text.getText());
            }
        });
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739909
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,

Опять же при объявлении таковой переменной, чтобы использовать ее во внутреннем классе нужно указать final
Простите, забыл
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739924
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все верно, и если теперь нужно считать штрих-код повторно?
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739930
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

А что там не так? У вас же получение штрих когда при обработке события возникает? Вот и думайте.
Вызывается метод у экземпляра класса текстового поля. Записывается в буфер. И каждый раз так будет происходить.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739940
gnick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я немного не об этом.
Естественно, первым делом я попробовал в лоб:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
final String BarCode;
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                //получаем штрих-код
                BarCode=Text.getText();
            }
        });



и, естественно, получил ошибку компиляции.

Однако, как оказалось, то, что предложили Вы существенно отличается от этого.
Собственно это именно то, о чем я спрашивал изначально :-) Премного признателен.
...
Рейтинг: 0 / 0
Чтение gui из другого потока
    #38739949
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gnick,

Конечно, отличается. Ведь ссылка на объект (как в случае с String) не меняется, а потому и final подойдет)))
...
Рейтинг: 0 / 0
79 сообщений из 79, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение gui из другого потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]