|
|
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. В 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. А вот что касается чтения данных из гуи, я так и не нашел пока ответа на свой вопрос. Укажите направление, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 23:12 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, зачем делать второй поток, если where, и наверняка, результаты используются из основного потока? По хорошему, нужен один поток на ГУИ и БД. Либо костыль в виде - делаем из двух потоков - один обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 11:16 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123 , Ага, и получите вы классику жанра: юзер плыкает на кнопку, визуально она "не отжимается обратно", все виснет, и только когда СУБД отдает ответ, оживает обратно. Работать с такими приложениями ужасно неприятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 12:14 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
cdtyjvвсе виснет сразу видно: 1) ты не работал на таких приложениях 2) чем ты решил заниматься пока ждёшь 1 сек 3) что у тебя за БД которая не отвечает 10-60 сек? 4) стандарт десктопа - post в БД при переходе курсора на след строку в таблице заказов....в том-же потоке. PS Java мало пишет клиент-сервер (ГУИ), а больше бекенд - серверную логику. Поэтому тут несколько искажённое представление о толстых клиентах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 13:03 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Тогда подробнее о самой задаче. Итак, допустим, в УФМС используется софтина, которая автоматически формирует заявление на выдачу загран паспорта. Человек пришел, данные забили, заявление напечатали. Но это только первый этап. Дальше эти данные должны попастьь в так называемое ППО "Территория" http://umms.reksoft.ru/ Как быть? заставлять работников повторно забить те же самые данные еще и в веб формы? Как временное решение (до принятия регламента электронного обмена) используется прога, которая берет данные из базы и сама заполняет поля этой веб-морды. Ну и отсюда вытекает специфика задачи, в частности ответ на вопрос, что за база, которая не отвечает по 10-60 секунд. Это элементарно возможно- клик на кнопке приводит к поиску по базе на веб сервере и страница грузится неопределенное время. Так что один поток, вроде бы, приведет к проблеме, озвученной во втором ответе топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 14:06 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Да, и еще одно- почему Java. "Территория" работает в браузере Google Chrome, автоматизация которого выполняется при помощи Selenium Web Driver http://www.seleniumhq.org/ . Как видим там небольшой выбор используемых для работы с драйвером языков программирования. С# я не знаю абсолютно. Поэтому выбрал Javy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 14:13 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, мож я чего не понял.. - веб проект или толстый клиент?....я увидел swt...... А пользователя конечно ничего не надо заставлять). До техрегламента перебрасывать данные из БД_А в вашу БД_Б по временному соглашению ...БЕЗ ГУИ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 14:29 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, в общем виде, перед стартом потока - собрать и дать ему все данные для работы. Чтобы потом не тормозить его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 14:33 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
КнопкаСтарт_onClick{ - штрихКод = editКод.text - ФИО = editФИО.text - StartServis(v1, v2, .....) потом запускай этот StartServis хоть из основного в этой же кнопке, хоть в потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 14:37 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
я бы так сделал. - в проге 2 модуля - ЗапросУФМС и СтартППО - В проге юзверь в основном потоке запрашивает УФМС и читает только чтение что там есть + получает токен доступа в УФМС. - при согласии нажимает ВАШУ кнопку СтартППО и туда идёт токен. далее вся обработка на вашем сервере. Ничего через клиента кроме токена не пересылается. Где тут потоки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 14:44 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, спасибо за внимание к проблеме, но теперь уже я мало что понял. Возможно, придется еще детальнее описать задачу. Значится так. Допустим, человек пришел за загранпаспортом. Он должен написать заявление. Он может это сделать самостоятельно, и эта ситуация не имеет никакого отношения к описываемой проблеме. Либо же он может воспользоваться платной услугой в том же УФМС, где ему сами напечатают заявление. Допустим есть прога А, которая заносит данные в базу MS Sql Server (в твоей терминологии наша база) и печатает это заявление. Но дальше информация из заявления должна попасть в ППО "Территория" (ссылку я уже приводил). Иного доступа к этой базе, кроме как через веб-интерфейс нет. Поэтому единственный способ, хоть как-то облегчить работу пользователям, это эмулировать ручной набор полей на форме сайта при помощи автоматизации браузера. Теперь о некоторых технических деталях. 1) Полностью автоматизировать ввод невозможно в принципе. 1.1) прежде чем добавить нового заявителя нужно убедиться, что его еще нет в базе, для чего сначала осуществляется поиск по документу, если не найден, то поиск по ФИО и только если и тут не найден появляется кнопка Добавить. Поиск по ФИО, возможно, вернет несколько возможных вариантов и только пользователь должен решить, выбрать ли один из них, либо-таки добавить нового. 1.2) ряд справочников совершенно не согласован со справочниками программы А. выбор из справочников представляет собой выбор из autocompleted field. Например, для поля "место регистрации, город" все, что можно сделать это забить в поле название города, после чего раскроется список выбора (и как правило он будет состоять не из одного элемента) и ожидать, когда пользователь сделает этот выбор. Отсюда следует простой вывод- нужно уметь останавливать процесс заполнения данных, и возобновлять его по команде. В случае двух потоков решение я вижу примерно таким: поток 2: ..... дошли до места, где надо встать synchronized(monitor) { monitor.wait(); ждем, пока пользователь не выполнит ручное редактирование и не жмакнет на кнопку Продолжить } Главный поток (в гуи по клику на кнопку Продолжить) synchronized(monitor) { monitor.notify(); } Буду признателен, если ты подскажешь, как реализовать желаемое поведение в однопоточном приложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 18:01 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnickИтак, допустим, в УФМС используется софтина, которая автоматически формирует заявление на выдачу загран паспорта. Человек пришел, данные забили, заявление напечатали. Но это только первый этап. Дальше эти данные должны попастьь в так называемое ППО "Территория" http://umms.reksoft.ru/ Как быть? заставлять работников повторно забить те же самые данные еще и в веб формы?Заставлять работников сразу вбить данные в веб-формы ППО "Территория" и только после этого заносить результат в "свою" базу. Ну или требовать доступ в рамках того же СМЭВ или аналога. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 18:39 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, а как соотносится эта ППО Территория и ГОСуслуги, через которую я получал загранпаспорт. Было быстро и удобно, не выходя из дома)) Почитал отзывы про ПО - есть над чем работать тупые java-апплеты грузятся по несколько секунд, печать листочков прибытия/убытия - это вообще отдельный разговор, а их вид и отсутствие возможности нормального редактирования (долбанный rtf формат) Если взять за образец - ГОСуслуги, то не хватает только согласовать ТЗ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 19:28 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, соотносится самым тесным образом- скорее всего это одна и та же база данных. Но заявления с портала госуслуг обрабатываются в порядке общей очереди. В моем случае все наоборот. Но мне все-таки хотелось бы вернуться к вопросу о чтении информации из визуальных элементов в дочернем потоке :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 20:24 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnickНо мне все-таки хотелось бы вернуться к вопросу о чтении информации из визуальных элементов в дочернем потоке :-) ОК. Я в политику не лезу). Давай без неё. ... Только давай конкретнее - в цифрах. - мой POST с записью в БД на AutoPOI длится 470миллисекунд. - сколько у тебя идут запросы, учитывая 2 факта: -- есть Гугл, который выдаёт поиск на ввод каждого символа -- запросы нужно разбить на мелкие после каждого контрола, а не загружать стрницу. ЗЫ. я не понял взаимодействие 3-х лиц: Ваш сиквел ---ППО --УФМС (это к вопросу Basil A. Sidorov без твоего ответа) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 20:47 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Тогда и я не понял, при чем тут это все (в т.ч. оставленный мной без ответа пост Basil A. Sidorov) Пойми, все, что я делаю, это программно имитирую пользовательский ввод на странице в хроме. выглядит это так. Пользователь щелкает сканером по штрих-коду, после чего нажимает кнопку Обработать и дальше "смотрит видео" где автоматически происходит заполнение полей на странице. Но периодически ему нужно вмешиваться в процесс, например делать выбор из справочника и снова запускать автозаполнение. Когда заполнение формы завершится, он все проверит и сам жмакнет по кнопке в браузере Сохранить. И может сканировать следующий штрих-код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:06 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, я не могу понять, где твой \ ваш код. И вы можете писать его "правильно". А где не ваш, и вы не можете на него повлиять. Напр. долгий ответ от БД в веб...... ....... Если полностью весь код в хроме (JS) твой, а веб сервис тормозит не по вашей причине. То: вар1 (как андроиде) - старт мелких потоков после выхода из фокуса. Результат потоков напр. по AJAX асинхронно проверяется не в вашей БД и заносится рядом контролом зелёным флажком. Как в Eclipse. Основной поток провярет эти флажки на кнопке "Далее". Для веб JS AJAX уже есть. Для анроида-подобных есть класс Код: java 1. в котором есть методы для ГУИ основного потока. Оно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:26 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
в том-то и дело, что весь код в хроме не наш и влиять на него мы не можем. Но есть средство автоматизации selenium web driver. Вот с его помощью я могу обращаться к элементам веб страницы т.е. писать что-то типа .....findElement(By.Id("Id элемента").setText и т.о. заполнять форму ввода в браузере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:33 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnickПользователь щелкает сканером по штрих-коду, после чего нажимает кнопку Обработать и дальше "смотрит видео" где автоматически происходит заполнение полей на странице. до чего доходят наши программисты, при волоките согласования гос-органов(( imho Было один раз - рисовал не в своём комоненте по hanle окна сверху. Он (компонент ничего не знал и перерисовывал стирая меня при перекрытии окна))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:34 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, Можно же реализовать интерфейс Runnable а в конструктор получившегося класса передавать либо ссылку на компонент, либо значение компонента (аля штрих-код). Ну, и в методе run реализовывать запрос к БД, например... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:36 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnickв том-то и дело, что весь код в хроме не наш и влиять на него мы не можем. Но есть средство автоматизации selenium web driver. Вот с его помощью я могу обращаться к элементам веб страницы т.е. писать что-то типа .....findElement(By.Id("Id элемента").setText и т.о. заполнять форму ввода в браузере. теперь я хоть ТЗ понял)))). Тут может кто подскажет. Такие хаки меня никогда не интересовали. т.к. селениум не знаю - OFF ......... а потоки тут каким боком? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:38 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, да. Я про него выше и писал. В андроиде по другому назван. .. Ну, и аффтар хотел один поток, а я предложил на каждый контрол. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:40 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, значение в конструктор передавать не могу- оно будет меняться (я не хотел делать на каждый штрих-код отдельный поток). А вот теперь поговорим поподробнее о передаче самого компонента в конструктор, т.к. именно так изначально и сдела NewTread(..... ,Text edBarCode, ) Но теперь попытка считать из него данные в методе Run без нагромождения этого Код: java 1. 2. 3. 4. 5. приводит к ошибке Invalid thread access А с нагромождением этого чуда, я не могу сохранить значение в локальной переменной. Вот как-то так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 21:55 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Я говорил об описании нового класса, который реализует (implements) интерфейс Runnable Например, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. А после: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:12 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38739464&tid=2126634]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 503ms |

| 0 / 0 |
