|
|
|
Чтение 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 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Как вариант, можно и в других местах собирать и хранить экземпляр класса (ибо я не вижу где и как это используется), реализующего Runnable, а в нужном месте просто использовать ссылку на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:18 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Есть вопрос по поводу Код: java 1. Насколько я могу судить по этому: 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 будет использовать поток дисплея(?) и поэтому будет блокировать пользовательский интерфейс. Как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:39 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Ну а я отвечал о наследовании от Thread. Есть ли разница в контексте рассматриваемого вопроса? Код: java 1. А вот вызывать сам конструктор здесь мне даже в голову не приходило. Спасибо за мысль, это надо обдумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:41 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi Все что исполняется ч/з (a)syncExec будет использовать поток дисплея(?) и поэтому будет блокировать пользовательский интерфейс. Как-то так. Вот это-то как раз не является неожиданным. Это, как я понимаю, аналогично делфийскому Synchronized(UpdateCaption). Не страшно, т.к. действия тут минимальны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:44 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, В контексте вопроса - без понятия. Знаю лишь, что, когда еще в универе начал изучать яву, сразу натолкнулся про совет реализовывать Runnable , а не расширять Thread . Опыта с многопоточностью пока толком не имел, ничего сказать не могу. Контекста то же не шибко усматриваю. Вообще, как могу полагать, здесь хватит анонимного экземпляра класса. Максимум, ссылка на экземпляр. А уж как вам этот поток запускать (ч/з (a)syncExec или ч/з new Thread(<экземпляр класса>) ) решать только вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:48 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, забыл, конечно же new Thread(...).start() ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:52 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
авторDisplay.getDefault().asyncExec(new NewClass(MyTextField)); Присмотревшись к этому коду я начинаю понимать, что метод run нового потока (т.е. все, что делает новый поток) будет перенесено в контекст основного потока. Как бы это не совсем то, чего хотелось бы :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:56 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, А если использовать Код: java 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 22:59 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
То тогда приходим к тому, с чего начали. Ссылку на компонент передадим. Объект потока создадим. При попытке реально считать текст из компонента без AsyncExec отхватим "invalid thread access". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:03 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:04 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Забавно все это. У меня-то все что есть это JFrame. В обработчике нажатия кнопки JButton Код: java 1. В NewClass run(): Код: java 1. - и все ок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:10 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, так, этот вариант я вроде бы тоже обдумывал, но, допустим, теперь пользователь изменяет значение текстового поля и мне надо записать туда новое значение. такое объявление переменной Код: java 1. ..... позволит мне в дальнейшем повторно вызвать: Код: java 1. 2. 3. 4. 5. 6. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:14 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Давайте еще раз уточним. Есть текстовое поле ввода. Есть БД. Необходимо формировать и посылать запрос к БД на основе содержимого текстового поля. Чтобы интерфейс пользователя не зависал на время выполнения запроса, необходимо запускать выборку в отдельном потоке. Так? Если так, то какие проблемы? Описываем класс, который реализует Runnable, в конструктор передаем ссылки на нужные объекты интерфейса, в которые можно будет записать данные, которые вернет запрос к БД. Про конструктор кстати и мог говорить Petro123 Petro123gnick, в общем виде, перед стартом потока - собрать и дать ему все данные для работы. Чтобы потом не тормозить его. И после этого использовать экземпляр данного класса как и было сказано раньше. Ч/з тот же SwingUtilities.invokeLater(<экземпляр класса>); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:22 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, нет, не так :-) Чесно говоря, я больше не осилю объяснение причин, по которым мне нужен второй поток, выше по тексту я уже написал все, что могу сказать по этому поводу. Код: java 1. Это будет означать, что мне надо на каждый новый штрих-код стартовать отдельный поток. Может быть и стоит так поступить, но это будет означать существенное перепроектирование структуры программы. Пока я хотел обойтись двумя потоками- один гуи- управляющий- обрабатывает сообщения операционной системы и юзера и управляет запуском остановкой второго потока обработки. А проблема лишь в том, повторюсь в очередной раз, что второй поток должен считывать данные из компонентов гуи, созданных в главном потоке, и делать это регулярно, а потому не только и не столько в конструкторе объекта потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:33 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
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. В итоге: мы можем передавать в конструктор класса два экземпляра на поля ввода. То, которое содержит штрих-код и то, в которое нужно вывести данные результата запроса. Например: Код: java 1. 2. 3. Таким образом можно и изменять доступность элементов для заполнения. Другой вопрос - организовать метод, который будет вызываться при нажатии на кнопку, и который будет в зависимости от шага обрабатывать другие поля ввода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:33 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, +1 единственно мне непонятна событийная модель ....при его "окно на JS браузера нет доступа к коду". Т.е. для старта запроса-потока при изменении текста нужно получить событие этого изменения. TextEdit.onChange в Delphi )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:36 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Кажется, я что-то упустил. О каком именно втором потоке речь? Если хотите использовать один экземпляр класса реализующего Runnable, или реализующего Thread, то придется использовать класс, который является расширением Thread, в котором добавить метод обновления ссылки на поле ввода. И на новом шаге после обновления ссылки ч/з метод, например, MyThread.setTextField(..), снова запускать поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:37 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, к сожалению мы ходим по кругу. Я снова вынужден повториться: Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:38 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, У вас в любом случае будет создавать каждый раз новый экземпляр класса потока. Но это же не говорит о том, что за единицу времени потоков будет больше два (если только вы не забудете отключать кнопку создающую поток, до завершения уже созданного потока) P.S.: очень удивился, когда загуглил ваше мыло. Надеюсь, поставщики по госзакупкам не сильно наглеют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:40 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, Может действительно проще разобраться почему у человека бросается исключение? Ведь мы одно и то же ему предложили))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:41 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnickМожет быть и стоит так поступить, но это будет означать существенное перепроектирование структуры программы. веский довод - надо всё переписать. автори делать это регулярно - регулярно делает работу Основной поток ГУИ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:41 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Хорошо, фиг с ним с тексовым полем. Что не так со значением? Почему вы считаете, что при нажатии на кнопку нельзя в поток передать значение, которое действительно на момент нажатия кнопки? Ну, введен штирх-код. При нажатии передаем в конструктор и запоминаем в поле класса это значение. В методе run формируем запрос и используем это значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:43 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychiPetro123, Может действительно проще разобраться почему у человека бросается исключение? Ведь мы одно и то же ему предложили))) пусть выложит минимальный рабочий код. Но я пас ))))). Не моя область JTextField )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:44 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, опять не врубился, увы. Код: java 1. 2. 3. Это зачем? Поток отрабатывает с одним штрих кодом и встает ( wait(), ожидая новый ) Пользователь сканирует новый штрих-код и нажимает Продолжить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:46 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Petro123, Да там от JTextField один только метод нужен, ну, максимум два. Я просто не знаток потоков и не могу сказать, почему исключение кидается именно в том месте и тут, действительно, нужен код. Нюансы хоть погуглить на основании чего-то будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:46 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, А зачем ему ожидать? Зачем закручивать всю логику на одном потоке? Пускай у вас поток будет выполнять только действия связанные с запросом, а состояние остальных компонент интерфейса меняйте по какому-нибудь счетчику шага что ли и в другом методе вообще. Для вас поток должен быть как бы изоляцией от потока, в котором идет отрисовка и не более. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:49 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. Напротив, я считаю, что так вполне можно сделать. Одна проблема в том, что я уже довольно много накодил и у меня второй поток стартует сразу же практически с запуском программы. До собственно ввода данных он запускает экземпляр хрома, осуществляет вход на сайт (если, указан автологин в ини-файле) или же ждет залогинивания юзера, проверяет выбран ли нужный раздел сайта и только в этот момент начинает обрабатывать штрих-коды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:51 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, а что там с моим мылом, не совсем понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:53 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, Например, Запускаете поток, пока поток жив гоняете цикл - можете картинку загрузки в цикле обновлять после цикла убираете картинку загрузки после пишете проверку полученных из базы данных - достаете их, например, через какой-нить метод класса NewClass (для этого вам нужно и хранить экземпляр объекта) после проверки идут действия с графическим интерфейсом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:54 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, ну что делать. Тебе оба говорят - максимум работы - в потоке ГУИ. Доп поток только оборачивать МЕДЛЕННЫЕ операции. Напр. у меня в андроиде только пост запрос на копку Старт Всё остальное успевает обработаться 1000 раз в основном потоке ГУИ IMHO Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:56 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Если второй поток не отвечает за отрисовку интерфейса пользователя, то какие тогда проблемы? Делаете в нем, что душе угодно, ибо это никак не отбразится на первом потоке, который отвечает за отрисовку и обработку событий пользовательского интерфейса. И не паритесь Ваш адрес электронной почты указан в качестве адреса электронной почты организатора открытого аукциона, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:57 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychiВаш адрес электронной почты указан в качестве адреса электронной почты организатора открытого аукциона, например.Это, как бы, требование законодательства ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:58 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Ну, я как поставщик это все понимаю. Просто удивился, что здесь увидел человека, тесно соприкасающегося с госзакупками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2014, 23:59 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, ну это давняя история. Когда-то я работал в организации, которая среди прочего была уполномоченным органом по размещению заказов для района. Что касается потоков. Нельзя сказать, что обрабатывающий поток никак не влияет на пользовательский интерфейс. Во-первых, в момент, когда он по какой-то причине останавливается, кнопочка Пауза меняется на Продолжить. Кроме того, выводятся сообщения в аналоге делфийского статусбара. И, наконец, с чего началась история, он должен считывать данные из гуи. Я бы и хотел не париться, но приходится :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:04 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Окей, тогда вопрос - что еще не работает, кроме вызова метода получения содержимого текстового поля? Если все остальное работает, почему бы не обойтись передачей значения(обновлением какого-то поля объекта), а не ссылки на экземпляр объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:07 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Off: я и не подозревал, что меня так много в гугле в связи с этими закупками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:07 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Это называется - прозрачность)))) Хотя она напрямую от наглости заказчика зависит, к сожалению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:09 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, обновление гуи работает как ожидалось. А вот поведение считывания оказалось странным. поэтому я и завел песню. Вы и Petro123 утверждаете, что все должно быть нормально. И, поскольку это говорят два человека, это повод серьезно задуматься, не накосячил ли я в чем-то другом. Что я сейчас и делалю. А другое, над чем я сейчас крепко размышляю, опять-таки по Вашему совету штамповать дочерние потоки только для процедуры обработки конкретного штрих-кода. Так что большое Вам спасибо за обсуждение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:12 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
В любом случае, я уже не имею отношения к закупкам на стороне заказчика. Скорее теперь на противоположной стороне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:13 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, По тексту увидите описание вашей проблемы. Можете не париться, в общем, SWT однопоточен. Там есть примеры. Можете использовать то, что приведено и, конечно, свой класс(ы), в котором(ых) нужная логика будет реализована. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:22 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за внимание к проблеме и ценные советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 00:27 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Вы хоть сообщите потом о результате своей деятельности в отношении данной проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 13:29 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, хорошо. Обратите все же внимание, что в указанной Вами статье, как собственно и в тех, которые нарыл в свое время я, упомянутая мной ошибка описывается в результате обновления данных гуи, а не попыток считывания оных. Поэтому иного способа сделать сколько-нибудь удачно, кроме передачи-таки самих значений в конструкторе, и, как следствие, создание отдельного потока на каждую новую обработку штрих-кода я по-прежнему не вижу. Видимо придется переделать все в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 17:53 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, На данный момент без кода и опыта, и опытов мне не разобраться. Пишут, что любое изменение из потока отличного от потока SWT UI будет бросать исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 18:02 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, По вашим же словам получается наоборот - методы, которые вносят изменения - не возбуждают исключение, тогда как метод получения содержимого поля вызывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 18:04 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
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. Если ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 18:26 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Вот теперь мы говорим на одном языке :-) Дойдя до этого кода я и залез с вопросом на этот форум. Код: java 1. Основной вопрос здесь такой- что тут есть переменная code? Где она объявлена и какова ее область видимости? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 19:44 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Сорри, был невнимателен к Вашему посту. Я думал Вы только в следующем предложите выделить член класса. В общем именно так у меня сейчас и реализовано. Но мне это не нравится. Эта переменная нужна очень ограниченный отрезок времени и необходимость резервирования для нее отдельного поля класса (а другого по-видимому просто нет) и наводит меня на мысль о том, что неверен сам подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 19:49 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, Пока мне не приходит в голову другой метод получения из внутреннего класса данных. Можно, конечно, так Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 20:00 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
smackmychi, Опять же при объявлении таковой переменной, чтобы использовать ее во внутреннем классе нужно указать final Простите, забыл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 20:01 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Все верно, и если теперь нужно считать штрих-код повторно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 20:31 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
gnick, А что там не так? У вас же получение штрих когда при обработке события возникает? Вот и думайте. Вызывается метод у экземпляра класса текстового поля. Записывается в буфер. И каждый раз так будет происходить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 20:38 |
|
||
|
Чтение gui из другого потока
|
|||
|---|---|---|---|
|
#18+
Я немного не об этом. Естественно, первым делом я попробовал в лоб: Код: java 1. 2. 3. 4. 5. 6. 7. 8. и, естественно, получил ошибку компиляции. Однако, как оказалось, то, что предложили Вы существенно отличается от этого. Собственно это именно то, о чем я спрашивал изначально :-) Премного признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 21:03 |
|
||
|
|

start [/forum/search_topic.php?author=And12&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
get settings: |
7ms |
get forum list: |
8ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 1526ms |
| total: | 1787ms |

| 0 / 0 |
