나는 기본적으로 물리 시뮬레이션을 시각화 한 프로그램입니다. 지금은 작동하지만 매우 반응이 없어 질 수 있습니다. 그리고 왜 - 너무 많은 (읽기 : 모두) 계산이 이벤트 스레드에서 수행됩니다.GUI 응답 속도 향상
'재생'버튼을 누르면 스윙 Timer
이 생성되어 주기적으로 깨어나고 updateTime()
(지금까지는 매우 양호) 전화가 걸립니다. 문제는 updateTime()
이 모든 시간 종속 객체를 반복하고 적절한 시간 (경과 된 실시간 또는 매일 틱 단위의 임의의 시간 단위)으로 정시에 전달하도록 알리는 것입니다. 이러한 계산과 후속 GUI 업데이트는 모두 이벤트 발송 스레드에 있습니다.
그래서이 계산을 가능한 한 많이 오프로드하고 싶습니다. SwingWorker
이 최선의 방법이라고 생각합니다. 그러나 기존 코드를 사용하는 방법을 잘 모르겠습니다. 이미 많은 클래스가 이미 다른 클래스를 확장하기 때문에 기존 클래스를 SwingWorker
까지 확장 할 수는 없습니다.
지금까지 가장 좋은 생각은 구현할 시간 의존적 개체마다 인터페이스를 만드는 것입니다. 인터페이스는 calcUpdateTime()
및 drawUpdateTime()
의 두 가지 메소드를 지정합니다. 현재 updateTime()
메서드를 각각 물리 계산 (calc_
)으로, GUI 업데이트 (draw_
)로 나눕니다. 그런 다음 생성자에서 TimeDependant
개체를 사용하는 SwingWorker 클래스를 하나만 만들고 그 doInBackground
은 calcUpdateTime
및 done
을 호출하면 drawUpdateTime
을 호출합니다. 그럼 나는이 상당히 느낌이 좋지 않기 때문에 SO가이 아이디어를 실행하고 싶었다
new MySwingWorker(myObj, currentTime).execute();
와
myObj.updateTime(currentTime);
의 모든 항목을 대체 할 수 있으며, 전체 프로젝트를 리팩토링을 피하기 위해 같은 것 다만 나가 나쁜 아이디어로 밖으로 시작했다는 것을 알아 내기 위하여. 또한, 각 틱마다 수십 개의 MySwingWorker
을 생성하는 것이 좋지 않은가요?
지금까지 읽어 주셔서 감사합니다.
또한 물리 및 GUI 코드가 함께 혼합되어 있다는 사실을 알고 싶지만 그 결정이 내려지면 주변에 있지 않았기 때문에 아기 단계를 밟고 있습니다. 결국, 두 가지 종류의 코드를 별도의 클래스가 아닌 별도의 메서드로 사용하고자합니다. –
타이머를 사용하면 버튼 클릭 이벤트와 다른 스레드에서 계산을 실행해야합니다. 일반적으로 시나리오에 1 개 이상의 SwingWorker가 필요하지는 않습니다. – sfussenegger
docs (http://java.sun.com/javase/6/docs/api/javax/swing/Timer.html)에 따르면 타이밍은 별도의 스레드에서 발생하지만 ActionEvent는 EDT에서 처리됩니다. –