powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение gui из другого потока
25 сообщений из 79, страница 2 из 4
Чтение 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
25 сообщений из 79, страница 2 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение gui из другого потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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