public static void moveTo(Coordinate destination) {
changeState(State.NAVIGATION);
controlPnl.addRemote(Remote.createRemote(remoteType.NAVIGATION));
dmc.moveTo(destination);
changeState(State.IMMEDIATE);
controlPnl.addRemote(Remote.createRemote(remoteType.IMMEDIATE));
}
이 코드에서 addRemote 메소드는 controlPnl GUI를 새 버튼으로 업데이트합니다. dmc.moveTo 메쏘드는 최대 두 개의 Thread.sleep 호출을 가지고 있으며 controlPnl GUI가 업데이트되기 전에 호출되고 있다고 생각합니다. dmc.moveTo를 호출 한 후에 GUI를 다시 변경하고 moveTo가 실행을 완료 할 때까지 controlPnl이 업데이트를 완료하지 않은 후에 두 메서드 호출을 주석 처리했습니다. 필요한 것은 moveTo 메소드가 실행되기 전에 GUI가 업데이트를 끝내고 스레드가 잠자기 상태가되도록하는 것입니다. Java 6에서이 작업을 수행 할 수있는 방법이 있습니까?GUI 업데이트 전 대기 스레드 (Java 6)
문제가있는 경우 moveTo 메서드는 LEGO Mindstorm 로봇을 사용자가 정의한 경로의 지정된 지점으로 이동합니다. 업데이트되는 GUI는 사용자가 네비 게이팅하는 동안 로봇을 제어 할 수 있도록 Swing 구성 요소 (JButton 및 JRadioButtons)를 제공합니다. addRemote 메서드는 사용자가 사용할 수 있도록 Swing 구성 요소 집합을 변경하고 moveTo 메서드는 실제 이동을 실행하기 위해 로봇에 명령을 보냅니다 (모터의 이동, 정확한 시간 동안의 잠자기, 모터에 알리기). 멈춤). 상태 머신 패턴을 사용하고 있는데이 메서드는 UI에서 이벤트를 처리하는 컨트롤러의 일부입니다.
당신이 그랬던 것처럼 나는 그것을 구현 (오히려 실행 가능한-에서-A-의 Runnable 익명 클래스를 사용하는 것보다 별도의 방법으로이 물건을 인수 분해에 더 많은 의미가 있습니다)뿐만 아니라,라고 나는 스레드에 가입 시작한 후. 나는 또한 Swing 호출을 SwingUtilities로 싸웠다.invokeLater'를 호출하면 moveTo 스레드가 실행을 마친 후에 GUI가 깜박입니다.하지만 GUI가 moveTo 메소드가 실행을 끝내고 NAVIGATION 뷰로 업데이트되고 즉시 IMMEDIATE 뷰로 돌아갈 때까지는 업데이트되지 않은 상태로 남아 있습니다. 도와 주셔서 감사합니다. 나는 지금있을 곳이 없다면 코드에 대한 자세한 내용을 추가 할 것입니다. – Nelson
@ user2065144 - 스레드에서'join()'을 호출하지 마십시오. GUI 스레드가 완료 될 때까지 기다릴 것입니다. 원래의 문제로 바로 돌아갑니다. 일단'run()'이 끝나면'Thread'가 끝나고 가비지 컬렉터가 될 것입니다. . –
네, 감사합니다. 나는 당신이 호출 한 스레드가 완료 될 때까지 조인이 현재 스레드의 실행을 멈추었다 고 생각 했으므로 코드를 IMMEDIATE로 다시 전환하지 못하도록했습니다. 그러나 이제는 조인을 제거했습니다. 'change state'와'add remote' 메쏘드를 run 메쏘드에 넣으십시오. 당신의 도움을 주셔서 대단히 감사합니다. – Nelson