2009-11-08 6 views
2

나는 학교 과제로 Java에서 유전 알고리즘을 쓰고있다. 지금까지 콘솔 응용 프로그램을 다루는 데 꽤 많은 노력을 기울였습니다. 그러나 UI가 정말이 프로그램에 도움이 될 것이라고 생각합니다. 그래서이 프로그램을 만들고 싶습니다. 이벤트 구동 형 GUI와 시작과 종료가있는 콘솔 응용 프로그램을 조정하는 방법을 파악하는 데 문제가 있습니다.이 CPU를 많이 사용하는 Java 응용 프로그램에 GUI를 어떻게 제공합니까?

이상적으로 설정을위한 텍스트 상자와 시작 버튼을 갖고 싶습니다. Start를 누르면 알고리즘이 실행을 시작하고 GUI가 일정한 간격으로 최신 프로그램 상태로 업데이트됩니다. 도대체 내가 GUI를 고정시키는 알고리즘이나 그 반대의 경우없이 어떻게 이것을 수행 할 수 있습니까? 나는 둘 중 하나가 다른 것을 기다리는 것을 원하지 않는다.

알고리즘이 실행되는 동안 메인 루프가 GUI를 정지시키지 않게하려면 어떻게해야합니까? 나는 그들이 분리 된 쓰레드에 있어야한다고 생각하지만, 이전에는 쓰레드를 사용 해본 적이 없다. 그것은이 작업에 너무 복잡해 보입니다.이 작업은 평범해야합니다.

+0

업데이트 . 그것은 매우 쉽고 훌륭하게 일했습니다. 나는 같은 상황에 처한 모든 사람들에게 적극 추천합니다. – Ross

답변

7

스레드가있는 항목을 사용 중입니다. 다행스럽게도 GUI의 프로그래밍은 스레드를 필요로합니다. 다행스럽게도 Java의 스레딩 API는 너무 끔찍하지 않습니다 (Python이 모델로되어 있으므로 무언가).

스레딩으로 협박하지 마라. 중간 정도지만, 모든 프로그래머가 이해해야 할 사항이다.

스레드에 대해 당신을 취약하게하는 많은 정보가 있습니다. 그러나 GUI 응용 프로그램은 놀라 울 정도로 유용합니다. 스레딩에 반대하는 사람들은 이벤트 프로그래밍 모델이이 경우에 도움이 될 것이라고 믿게합니다. 실제로는 그렇지 않습니다. 대부분의 사람들이 "쓰레기를 빤다"라고 말하는 해결책은 종종 쓰레딩보다 더 나쁩니다.

솔루션을 단일 스레드로 만들려고 시도 할 수도 있지만, CPU 집약적 인 코드가 예측 가능한 간격으로 GUI에 제공되어야합니다. 그 해결책은 짜증. 편집 : 다른 사람들이 그 접근법을 제안하고 있기 때문에 왜 그것이 끔찍한 지 자세히 설명해 드리겠습니다. 당신에게 알려지지 않았지만, 뭔가가 GUI에서 항상 업데이트되고 있습니다. 창을 맨 위에 놓은 다음 다시 끄면 해당 창 아래의 전체 영역이 무효화되고 코드가 프로세스에서 실행되어 해당 섹션을 다시 그려야합니다. GUI를 매우 빠르게 업데이트하더라도 간단한 GUI 조작이 완전히 차단되어 사용자 경험이 부정적인 영향을줍니다. 때때로 마우스 오버시 버튼이 강조 표시됩니다. 사용자가 마우스 오른쪽 버튼을 클릭합니다. 이러한 모든 작업을 수행하려면 CPU 시간이 필요하며, 단독 스레드가 GA에서 씹어내는 경우 발생하지 않습니다. 실행중인 GUI 코드는 코드 인 뿐입니다.

여기에 very useful article on the topic 인 것으로 보입니다. 주제에 흔적에

두 가지 교훈은 다음과 같습니다

  1. Concurrency
  2. Concurrency in Swing
+0

+1 스윙의 동시성에 대한 문서 –

3

내가 대학에서 컴퓨터 그래픽 클래스 중 하나의 광선 추적을 작성하고, I 장기 실행 작업이 있었고 트레이서가 그려지면서 주기적으로 디스플레이를 업데이트하려고했습니다. 두 개의 개별 스레드를 사용했습니다. 하나의 스레드는 잠자기 상태이고 업데이트는 500 밀리 초라고합니다. 다른 스레드는 실제 광선 추적을 수행합니다.핵심은 공통 객체에서 동기화하는 것입니다. 제 경우에는 이미지 버퍼에 액세스하는 것이 동기화 시점이었습니다 (다른 스레드가 읽기를 완료 할 때까지 대기하지 않고 한 스레드가 이미지 버퍼를 변경할 수 없습니다).

: 당신은 당신이 당신의 GUI에 표시 할 상태를 저장하는 오브젝트로, generationHistoryObject을 가지고 가정하면

: 당신의 GA 처리에 대한

, 당신은이 (의사) 같은 것을 할 수도 있습니다 (스레드 번호 1 :

Generation newGeneration = doMutationAndTestThisGeneration(lastGeneration); 
synchronized (generationHistoryObject) { 
generationHistoryObject.updateWithNextGeneration(newGeneration); 
} 

(스레드 # 2 :

while (!programIsDone()) { 
synchronized (generationHistoryObject) { 
    drawGuiForCurrentState(generationHistoryObject); 
} 
Thread.sleep(500); 
} 

아이디어는 각 세대마다 독립적으로 시간을 소비하는 작업을 수행 한 다음 GUI가 동기화 된 블록에서 액세스해야하는 부분을 업데이트하여 GUI가 업데이트가 완료 될 때까지 그릴 때까지 기다리게하는 것입니다.

+1

"동기화"를 두 드리거나 두 스레드가 동일한 객체에 액세스 할 수 있습니까? 너무 쉬운 것 같습니다! – Ross

+0

@ 로스 : 스레딩에 깊이 빠져 들었다면 (약 1 년 후에), 다시 SO에게 돌아와 그 코멘트를 다시 읽으 리라는 약속을하십시오. –

+0

약속입니다. – Ross

1

응용 프로그램이 유전 알고리즘과 관련이 있으므로 세대마다 GUI를 업데이트 할 수 있습니다. 알고리즘 코드에 next() 메서드를 구현하고이를 GUI에서 호출하여이를 수행 할 수 있습니다. 이것은 충분히 간단해야합니다.

그러나 알고리즘을 기다리는 동안 GUI가 멈추지 않게하려면 스레드를 사용해야합니다.

5

미안 - 배경 작업이 쉽고 분명한 일일 것 같습니다. 불행히도 Java Swing GUI 스레딩 모델은 약간 복잡합니다. 이 분야에서 약간의 개선이 있었지만, 여전히 스레딩에 대한 지식이 있어야합니다.

시간이 있으시면 Filthy Rich Clients에있는 스레딩 장을 읽어 보시기 바랍니다. SwingWorker를 통한 Pure Threading.

alt text

은 참을성, 그냥 SwingWorker에의 JavaDoc을 참조하십시오. 만약 이라면 참을성이 없으니의 의미를 JavaDoc 샘플 사용에서 의 예제로 복사하십시오.

2

스윙에 대한 문제점은 단일 스레드 (좋은 점)이므로 스윙 스레드에서 작업하여 응용 프로그램이 응답 할 수 있도록하려는 것입니다.

당신이해야 할 일은 핵심 알고리즘을 SwingWorker와 새로운 Executor가 쉽게 처리 할 수 ​​있도록 Runnable로 변환하는 것입니다 (많은 사전 구성된 Executors를 참조하십시오). 또한 JTextPanel에 PrintStream을 만드는 방법을 조사하여 표준 println 문을 사용하여 현재 상태 정보를 출력 할 수 있습니다.

정지 버튼을 추가하려면 스레드 모델을 이해해야하므로 스레드 모델을 제어하는 ​​방법을 알 수 있습니다. 자바 튜토리얼은 일반적으로 스윙 프로그래밍뿐만 아니라 이것에 대한 좋은 자료를 가지고있다. 권장. 나는 SwingWorker의를 사용하여 결국이 유용하게 찾을 수있는 사람을 위해

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

관련 문제