2016-12-29 3 views
1

현재 저는 rgb led 스트립과 연결된 Arduino가있는 직렬 포트에 100에서 355 사이의 값을 보내는 프로그램을 개발 중입니다.JSlider 프로그램이 멈 춥니 다

프로그램이 조금은 정상적으로 작동하지만 갑자기 멈추고 슬라이더를 움직이거나 아무 버튼이나 클릭 할 수 없습니다.

나는 슬라이더를 천천히 움직이면이 문제가 자주 발생하지 않기 때문에 프로그램에서 너무 많은 이벤트를 처리하기 때문에 발생한다고 생각하지만 슬라이더에 의해 활성화 된 이벤트의 양을 줄이는 방법을 모르겠습니다.

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

송신 데이터가 동결을 일으키지 않는 것 같다. 응용 프로그램도 * 스윙 이벤트 스레드에서 * 데이터를 받고 있습니까? –

+0

............................ hello ?? –

답변

4

그것은 전체 프로그램없이 확실히 말하기 어렵지만, 당신이 읽고있는이 나타나고 여기에

는 슬라이더에 대한 나의 코드입니다 ChangeListener에서 데이터를 쓰는 중입니다.

Event Dispatch Thread (EDT)이 추가 이벤트를 처리 할 수없는 불확실한 시간 동안 읽기 및 쓰기 작업 블록입니다. EDT를 차단하면 GUI가 정지 된 것으로 보입니다.

읽기/쓰기 작업을 처리하기 위해 다른 스레드를 회전 시키거나 EDT를 막지 않도록 SwingWorker을 사용하십시오.

(는 A Minimal, Complete, and Verifiable example에 게시물을 업데이트하고 난 당신에게 좀 더 구체적인 지침을 제공하려고합니다)

+1

다음과 같이 추가합니다. 이벤트 발송 스레드에서 코드가 실행 중인지 여부를 확인하려면 javax.swing.SwingUtilities.isEventDispatchThread를 호출합니다. –

+0

고마워 이것이 내 게시물을 완벽하게 편집했습니다. – DiamondShark286