2012-12-21 2 views
1

저는 멀티 스레딩, Java 및 JavaFx에 익숙하지 않습니다. 라이브 데이터를 기반으로 그래프를 지속적으로 업데이트하는 JavaFX UI로 애플리케이션을 구축하고 있습니다. 여기에 현재 디자인 인 자바 FX 버튼을 누르면, JavaFx 자바 스레드의 알림을 기반으로 UI 업데이트

1.

, 나는 응답입니다

startButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent e) {    
      stopButton.setDisable(false);    

      if(!startButton.isDisable()){ 
       runSequence = new Thread(new Runnable(){ 

        @Override 
       public void run() { 
        SynchThreads sharedObject = new SynchThreads();    
        new Bridge(sharedObject); 
        startSequence = new Sequence(sharedObject);    
        startSequence.performCalls(); 

        }     
       }); 

       runSequence.start(); 

      }    
      startButton.setDisable(true); 
     } 
    }); 

2 runSequence 스레드를 요청을 보내고 얻을 수있는 프레임 워크를 설정하는 스레드를 호출 위와 같이 호출하면 끊임없이 데이터를 수신하는 다른 스레드 "callbackThread"가 호출됩니다. 수신이 데이터

BusinessLogic businessLogic = new BusinessLogic(); 

    executor.submit(pduApiDllCallBackThread);//This collects the data in background 

//Here we are back on runSequence thread that works on the collected data. 
     while(true){ 
     response = sharedObject.take();     
     businessLogic.primeData(response); 
    } 

3이 데이터에 대해 작업을 한 후 BusinessLogic 클래스 그래프에 도시한다 이벤트 ID 및 데이터를 사용자 인터페이스에 통지 추가 처리 runSequence 스레드에 전달된다. 사용자 인터페이스 매번에서

4.

UI.notifyListeners(0, graphCoords);//here event ID is 0 and graphCoords is a HashMap 
은 내가 Platform.runLater를 사용하여 선 차트를 업데이트 알림을받을. 이 알림은 4 밀리 초마다 발생합니다. 그래서, Platform.runLater의 많은이이 작업을 수행 할 수 확인 경우

public void notifyListeners(int eventType, Map<Integer, Float> graphCoords) { 
    Platform.runLater(new Runnable(){ 

     @Override 
     public void run() { 
    //Old series is cleared. Showing dummy data being updated 
        series.getData().clear(); 
     series.getData().add(new XYChart.Data("1", Math.random()+1)); 
      series.getData().add(new XYChart.Data("3", Math.random()+5)); 
      series.getData().add(new XYChart.Data("4", Math.random()-25)); 
      series.getData().add(new XYChart.Data("2", Math.random()-10)); 
      series.getData().add(new XYChart.Data("-1", xxx)); 


     } 

    }); 

} 

이 전문가의 조언을 주시기 바랍니다 전화 또는 UI.I에서이 처리하는 더 나은 방법이 있는지하지 않는 일을 끝낼 UI 아래에있는 레이어를보다 잘 제어 할 수 있습니다. 알림이 4ms마다 발생하므로 더 나은 접근 방법이 있는지 알고 싶습니다.

도움을 주시면 감사하겠습니다. 도와주세요. 감사 !

답변

2

Platform.runLater를 자주 실행하여 JavaFX 이벤트 대기열을 잠식시킬 수 있으므로 응답을 일괄 적으로 일괄 처리 (예 : 10 개 그룹으로) 한 다음 각 일괄 처리에 대해 단일 실행자 호출을 만들 수 있습니다.

codereview 사이트가 stackoverflow에 있습니다.

차트에서 애니메이션이 해제되어 있는지 확인하여 각 업데이트가 너무 많이 수행되지 않도록하십시오.

귀하의 솔루션은 다소 복잡해 보이지만 귀하의 상황에 따라 보증 될 수 있습니다. 잘 모르겠습니다.

동시성을 어떻게 처리하는지 모르겠지만 java.util.concurrentconcurrency tutorial을 아직 보지 않은 경우 살펴보십시오. 아직 체크 아웃하지 않았다면 Concurrency in JavaFX을 체크 아웃하십시오. 때로는 더 높은 수준의 java.util.concurrent 프레임 워크는 표현력이 뛰어나고 오류가 발생하기 쉽고 하위 수준의 객체 모니터 대기/통지 메소드보다 작업하기가 쉽고 추론하기 쉽습니다.

사용중인 일부 스레드를 daemon threads으로 표시 할 수 있습니다. 또한 JavaFX Task 설명서의 예제와 유사하게 스레드 중단이나 프로세스 취소를 처리하는 논리를 추가 할 수도 있습니다.

Java를 처음 사용하는 경우 다중 스레드 및 JavaFX가 멀티 스레드, 네트워크로 연결된 JavaFX 응용 프로그램으로 시작하여 심층적으로 뛰어납니다.

종종 Task/Service framework을 사용하여 동시 작업이 JavaFX 응용 프로그램 스레드에서 작업자 스레드로 오프로드됩니다.

+0

감사합니다. 응답을 받고 응답을 처리하는 스레드간에 공유 객체가 있고 오라클 워드 프로세서에서 설명한대로 간단한 대기 알림 메커니즘을 사용합니다. 내 관심사는 최종 결과와 JavaFx 스레드가있는 시작 버튼에서 호출되는 스레드 간의 상호 작용에 관한 것입니다. 이것을 처리 할 대체 방법이 있습니까? 제발 제안 해주세요. – user1724114

+0

나는 그 상호 작용에 대해 어떤 걱정도하지 않는다. – jewelsea

+0

안녕하세요, Jewelsea, 자세한 답변을 주셔서 감사합니다. 고맙습니다. 즐거운 X-Mas와 새해 복 많이 받으세요. – user1724114

관련 문제