2016-12-29 6 views
1

В настоящее время я разрабатываю программу, которая будет отправлять значение между 100 и 355 в последовательный порт с помощью Arduino, связанного с полосками rgb.JSlider freezes program

Программа работает нормально, но затем внезапно замерзает, и я не могу перемещать ползунки или нажимать на любую из кнопок.

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

Вот мой код для слайдера:

redslide.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent arg0) { 
     try { 
      output.flush(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     int brightness = redslide.getValue(); 
     String message = "r" + brightness; 
     byte[] data = message.getBytes(); 
     try { 
      output.write(data); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

вот мой новый код:

redslide.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent arg0) { 
     int brightness = redslide.getValue(); 
     String message = "r" + brightness; 
     byte[] data = message.getBytes(); 
     new Thread(() -> Write(data)).start(); 
    } 
}); 

public static void Write(byte[] data){ 
     try { 
      output.write(data); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

передача данных, скорее всего, не вызывая замораживания. Является ли приложение также * принимающим * данными в потоке событий Swing? –

+0

............................ привет ??? –

ответ

4

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

Операционный блок чтения и записи для неопределенного промежутка времени, в течение которого Event Dispatch Thread (EDT) не может обрабатывать дополнительные события. Блокировка EDT заставит ваш графический интерфейс выглядеть замороженным.

Попробуйте открутить другой поток для обработки операции чтения/записи или использовать SwingWorker, чтобы избежать блокировки EDT.

(Обновление пост с более Minimal, Complete, and Verifiable example и я постараюсь дать вам некоторые более конкретные указания)

+1

Я бы добавил: Если вам нужно определить, работает ли ваш код в потоке отправки событий, вызовите javax.swing.SwingUtilities.isEventDispatchThread. –

+0

Спасибо, что работал отлично отредактировал мой пост. – DiamondShark286