2010-07-15 3 views
1

Java에서 프로그램에 로딩 바 기능을 추가하고 완료해야하는 프로세스의 수를 알 수 있도록 수행해야 할 프로세스 목록을 설정할 수 있는지 궁금합니다.메서드 호출을 ArrayList에 넣으시겠습니까?

예를 들어 문자열로 저장 하시겠습니까?

ArrayList<String> processes = new ArrayList<String>(); 
processes.add("CSVWriter.createFileOfCompany(\"Random Company\");"); 
processes.add("FileConverter.convertCSVToXLS(classPath + 
    \"/Output/Random_Company.csv\");"); 

for (int i = 0; i < processes.size(); i++) { 
    // run process 
    // update loading bar 
} 

이들은 내 프로그램에 대한 실제 방법이 아니지만, 내가 달성하고자하는 것과 매우 유사합니다.

나는 이것이 최선의 방법은 아니지만이 같은 목록을 만드는 방법이 필요하므로 실행하기 전에 얼마나 많은 프로세스가 있는지 알고 싶습니다. 나는이 프로세스를 더욱 더 세분화하고 진행 상황을 보여줄 수있는 시스템을 만들었으므로이 시점은 꽤 정확하지만 각 프로세스에 번호를 매겨 야합니다. /.

아마도 나는 그 요점을 놓치고 있습니다. 진행률 표시 줄 만들기는 완전히 새로운 것입니다.

진행률 표시 줄 만들기에 대한 유용한 기사가 있으면 내 방식으로 보내 주시기 바랍니다. 실제 스윙 기반 GUI를 사용하지 않는다는 것을 명심하십시오. 이 막대는 모두 S.O.P 텍스트입니다.

많은 감사,

Justian 마이어

+0

당신은 모든 방법을 실행하는 데 시간이 동일한 금액을 가지고가는 것을 가정하고 있습니까? –

+0

나는 그 (것)들을 기대하지 않는다. 기본적으로 메소드를 동일한 블록으로 나누고 싶습니다. 통화가 5 번이면 5 개의 블록으로 나뉩니다. 이 블록들 각각은 메서드의 루프에서 정보를 천천히 채 웁니다. 이것을 다음과 같이 상상해보십시오.'[///// | ///// | ///// | ///// | /////]'...................................'[///// | ///// | // ... | ..... | .....] '는 처음 두 프로세스가 완료되고 프로세스 3의 2/5가 완료되었음을 의미합니다. 물론, 더 같을 것이다 :'[//////////// .............] 48 %' –

+0

이를 만들기위한 나의 방법은 진짜로 아니다 내가 원했던 것처럼 깨끗하게, 그래서 나는 더 나은 아이디어에 완전히 열려있다. –

답변

5

클로저 희망 자바의 다음 버전에서 곧 출시 될 것이지만, 그때까지 당신이 알고있는 인터페이스를 구현하는 익명 클래스를 사용할 수 있습니다

List<Runnable> jobs = new ArrayList<Runnable>(); 

jobs.add(new Runnable() { 
    public void run() { 
     CSVWriter.createFileOfCompany("Random Company"); 
    } 
}); 

jobs.add(new Runnable() { 
    public void run() { 
     FileConverter.convertCSVToXLS(classPath + "/Output/Random_Company.csv"); 
    } 
}); 

for (Runnable job : jobs) { 
    job.run(); 
} 
+0

왜 대신 자신의 '작업'인터페이스를 만드는 (당신이 예외를 throw 할 수 있어야합니다 경우) 단지의 Runnable 또는 Callable를 사용하지 마십시오. –

+1

피터, 내가 편집, @Sanity에 대한 – sanity

+0

감사합니다 :-) 그것을 이길. 나는 그 중간에 있었다. 원래 아이디어를 더 잘 보여주기 위해 맞춤 인터페이스를 사용하기로 결정했으나 이는 단지 잡음을 추가하는 것이 었습니다. – Gunslinger47

2

을 방금 내 마음에 온 계획이 있습니다.

interface WorkProcess 
    void setWorkUnits(int units) 
    void setArguments(Object obj1,...) 
    void execute() 

따라서 고전적인 명령 패턴에 따라 execute을 수행하는 인터페이스로 모든 작업을 캡슐화합니다. 그것은 또한 일자리가 아마도 얼마나 많은 일을 할 것인지 (아래 참조)라고 말하고있다. 당신은 아마 그들과 함께 일할 수 있도록 이러한 작업에 데이터를 전달하는 메커니즘을 원할 것입니다.

class WorkProcessFactory 
    static WorkProcess makeWorkProcess() 
    static int getTotalWorkUnitsAllocated() 
    static synchronized int reportWorkDone(int units) 
    static void addProgressListener(ProgressListener xxx) 

할 일이있을 때, 공장에이 과정 중 하나를 수행하도록 요청합니다. 그렇게하면 작업 단위에 대한 예상치를 작성한 후 방금 작성한 작업 프로세스로 전달합니다. 또한 진행률 표시기 상단을 설정하기 위해 해당 장치의 합계를 표시합니다. 이 작업의 한 가지 부작용은 모든 작업을 준비 할 때까지 기다릴 필요가 없다는 것입니다. 작업이 처리되고 새로 작성된 경우에도 작업을 추가 할 때마다 진행률 보고서의 최대 값을 증가시킬 수 있습니다. 귀하의 술집은 항상 현실적인 비율을 보여줍니다.

일종의 대기열에 작업 프로세스를 채울 수 있습니다. ExecutorService은 WorkProcess가 Runnable 인터페이스를 구현하는 경우 마음에 듭니다. (좋은 생각입니다). 실행 대기열 기계가 지원하는 모든 작업을 순차적으로 단일 파일 또는 동시에 처리 할 수 ​​있습니다. (ExecutorService를이 run() 메소드 기대하지만, 우리의 작업 단위의 마법 execute()에 있기 때문에, 주위 아니면 다른 방법)

WorkProcess 'execute() 방법은 기본적으로 run() 방법을 랩; 그러나 그 일이 끝나면 양심적으로 reportWorkDone으로 전화를 걸어 그 일이 가치 있다고 말한 단위 수를 얻습니다. 이러한 보고서를 수신하면 공장에서 완료된 작업 단위에 대한 업데이트 된 값을 갖게되어 스누핑 ProgressListener에 다시보고 할 수 있습니다. 그러면 GUI의 막대가 업데이트됩니다.

완료. (나는 생각한다). 아마도 약간의 정제가 필요할 것입니다.

관련 문제