Проблемы цикла - PullRequest
1 голос
/ 26 мая 2009

Я читаю данные из последовательного порта внутри цикла while следующим образом:

while((len = this.getIn().read(buffer)) > 0) {
    data = new String(buffer, 0, len);
    System.out.println("data len " + len);
    handleModemresponse(data);
}

но, когда начинается чтение данных из потока, главное окно AWT, имеющее кнопку отключения, не получает никаких слушателей (все окно не получает слушателей). Он только слушает, когда передача завершается, то есть вне цикла while.

Я хочу, чтобы мое окно AWT прослушивало мои действия, когда оно также находится в цикле while.

Есть идеи, как мне этого добиться?

Ответы [ 4 ]

5 голосов
/ 26 мая 2009

Создать новую тему для действия чтения.

public class LongProcess implements Runnable {
  public void startProcess() {
    Thread t = new Thread(this);
    t.start();
  }

      public void run() {
// Define inputstream here
        while((len = inputStream.read(buffer)) > 0) {
         data = new String(buffer, 0, len);
         System.out.println("data len " + len);
         handleModemresponse(data);
        }
      }
    }

РЕДАКТИРОВАТЬ (после комментария Tom Hawtin - tackline):

SwingUtilities.invokeLater(new LongProcess ());
4 голосов
/ 26 мая 2009

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

Вы должны разделить посещаемость GUI в одном потоке и метод работы в другом.

2 голосов
/ 26 мая 2009

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

1 голос
/ 26 мая 2009

Я подозреваю, что вы должны помещать этот цикл while в отдельный поток, чтобы не связывать ваш поток AWT во время передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...